2

我希望能够从包含整数、浮点数和字符串的用户定义字符串中仅提取整数。我目前正在使用 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']

这当然有效,对于我解决这个特定问题所需的东西很好,但它让我思考;在我看来,如果字符串真的很长,这可能不是处理问题的最有效方法。有没有更好的办法?

4

1 回答 1

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()and.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
于 2013-05-13T20:21:47.277 回答