今天有一个小伙伴想要从“498人”这个字符串里截取数字出来,我脑子里虽然飘过不少方法,但是觉得不码出来就等于是空的。网上找了些资料,总结出了一些干货,在此记录下来。

首先先看一个字符串:

mystring = u'今年18岁'

这个字符串有汉字还有数字,现在我们要提取出其中的数字,或许我们马上就会想到一种方法:切片。
的确,切片的确可以简单粗暴的解决一些事情,比如这个字符串,从第三位到倒数第二位就是数字。代码如下:

mystring = u'今年18岁'
print(mystring)[2:-1]

运行结果如下:

18

方括号中的2为起始索引,这里指的第三位,-1为结束索引,这里指的是倒数第二位,结合起来取的就是18这个数字了。完整的切片操作格式是[start:stop:step],step指步长,具体作用这里不做展开。

貌似这个方法甚好,小伙伴们打完收工就要去喝咖啡了,但是这个方法太死,万一字符串做变动,这个方法就不适用了,比如我把这个字符串改成“我今年18岁你信吗”,这代码是不是也要跟着改了?

这个时候就要搬出比较高级的用法了:filter()函数~

来看看官方解释:

python字符串数字 python字符串中数字提取_python字符串数字


简单说来就是,用一个自定function来过滤iterable,那么这里的关键就是怎么写这个function了。到这里又要用到一个函数str.isdigit,这个函数是用来判断字符串是否只有数字组成,组合起来使用就是:filter(str.isdigit, iterable),把序列(iterable)的每一项传到自定义的过滤函数(str.isdigit)里来处理,代码如下:

mystring = u'今年18岁'
print(filter(str.isdigit, mystring))

不过这段代码运行起来会报错:

TypeError: descriptor 'isdigit' requires a 'str' object but received a 'unicode'

由于mystring是unicode类型,这里只要做一下转码就可以,做完后我们用type函数来验证一下:

mystring2 = mystring.encode('gbk')
print(type(mystring2))

打印结果:

<type 'str'>

最后附上完整代码:

# encoding:utf-8

mystring = u'今年18岁'
mystring2 = mystring.encode('gbk')
print(type(mystring2))
print(filter(str.isdigit, mystring2))

这样就能实现快速从字符串中截取数字了:

<type 'str'>
18