Python 2.7:从字符串中提取所有整数值的更快/更好的方法?

时间:2013-05-13 20:18:09

标签: python string

我希望能够从用户定义的字符串中提取整数,包括整数,浮点数和字符串。我目前正在使用split()和isdigit()方法来取出所有整数并将它们连接到一个列表:

stringy = "If y0u can 66.6 r34d 25 this, you're 29 t00 close."
stringz = [item for item in stringy.split() if item.isdigit()]
print stringz
>> ['25','29']

这当然有效,而且对于这个特殊问题我需要的东西很好,但它让我思考;在我看来,如果字符串真的很长,这可能不是处理问题的最有效方法。还有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

使用正则表达式可以起作用:

import re

integers = re.compile(r'(?<!\S)\d+(?!\S)')
integers.findall(stringy)

演示:

>>> import re
>>> stringy = "If y0u can 66.6 r34d 25 this, you're 29 t00 close."
>>> integers = re.compile(r'(?<!\S)\d+(?!\S)')
>>> integers.findall(stringy)
['25', '29']

对于较短的输入示例,.split().isdigit()列表理解仍然更快:

>>> import timeit
>>> timeit.timeit('[item for item in stringy.split() if item.isdigit()]', 'from __main__ import stringy')
3.1379640102386475
>>> timeit.timeit('integers.findall(stringy)', 'from __main__ import stringy, integers')
4.119225978851318

输入时间越长,效果越差:

>>> stringy = ''.join([stringy for _ in range(100)])
>>> timeit.timeit('[item for item in stringy.split() if item.isdigit()]', 'from __main__ import stringy', number=10000)
2.5325310230255127
>>> timeit.timeit('integers.findall(stringy)', 'from __main__ import stringy, integers', number=10000)
4.044284105300903