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

Python2.7:从字符串中提取所有整数值的更快/更好的方法?,python,string,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'] 这当然有效,对于这个

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

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

使用正则表达式可以:

import re

integers = re.compile(r'(?<!\S)\d+(?!\S)')
integers.findall(stringy)
输入时间越长,改善就越少:

>>> 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

使用正则表达式可以:

import re

integers = re.compile(r'(?<!\S)\d+(?!\S)')
integers.findall(stringy)
输入时间越长,改善就越少:

>>> 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

这类问题更适合。即使问题是理论性的,而不是解决实际问题,情况也是这样吗?我的印象是,这更多的是针对实际问题。这类问题更适合。即使问题是理论性的,而不是解决实际问题,也是这样吗?我的印象是,这更多是为了解决实际问题。谢谢!总是很高兴学习新东西。@user2113818:我发现了一个稍快一点的版本,但仍然比不上
.split()
.isdigit()
测试。正则表达式的一个稍短的替代选项:
(?@F.J:我的新版本使用
[\b\s]
因为锚定更快;消极和积极的前向/后向很不幸是这里的速度下降。我不认为你可以在字符类中设置单词边界,这将尝试匹配空格或退格字符。谢谢你!学习新东西总是很好。@user2113818:我发现了一个稍微快一点的版本,但仍然无法击败
.split()
.isdigit()
测试。regex的一个略短的替代选项:
(?@F.J:My较新版本使用
[\b\s]
因为锚定更快;消极和积极的前向/后向很不幸是这里的速度下降点。我认为不能在字符类中设置单词边界,这将尝试匹配空格或退格字符。