[英]Cleanest way to obtain a list of the numeric values in a string
获取字符串中数值列表的最简洁方法是什么?
例如:
string = 'version_4.11.2-2-1.4'
array = [4, 11, 2, 2, 1, 4]
您可能理解,我需要比较版本。
“最干净”,我的意思是尽可能简单/简短/可读。
另外,如果可能的话,我更喜欢内置函数而不是regexp( import re
)。
这是我到目前为止所得到的,但我觉得它很笨拙:
array = [int(n) for n in ''.join(c if c.isdigit() else ' ' for c in string).split()]
奇怪的是,我无法在SO上找到答案:
谢谢
只需匹配连续数字:
map(int, re.findall(r'\d+', versionstring))
数字之间的关系并不重要; \\d+
匹配可以连续找到的数字。 这为Python 2提供了所需的输出:
>>> import re
>>> versionstring = 'version_4.11.2-2-1.4'
>>> map(int, re.findall(r'\d+', versionstring))
[4, 11, 2, 2, 1, 4]
如果您使用的是Python 3, map()
会为您提供一个可迭代的map
对象,因此要么调用list()
,要么使用列表解析:
[int(d) for d in re.findall(r'\d+', versionstring)]
我也用正则表达式来解决这个问题。
我更喜欢re.finditer
不是re.findall
来完成这项任务。 re.findall
返回一个列表, re.finditer
返回一个迭代器,所以使用这个解决方案你不会创建一个临时的字符串列表:
>>> [int(x.group()) for x in re.finditer('\d+', string)]
[4, 11, 2, 2, 1, 4]
正如@MartijnPieters回答清楚显示的那样,正则表达式绝对是最好的方式,但如果你不想使用它,你可能无法使用列表理解。 但是你可以这样做:
def getnumbers(string):
numberlist = []
substring = ""
for char in string:
if char.isdigit():
substring += char
elif substring:
numberlist.append(int(substring))
substring = ""
if substring:
numberlist.append(int(substring))
return numberlist
您正在跟踪每个字符并检查它是否为数字,如果是,则将其添加到列表中,对于较大的字符串变慢。
比方说,
import re
string='version_4.11.2-2-1.4.9.7.5.43.2.57.9.5.3.46.8.5'
l=map(int, re.findall('\d+',string))
print l
希望这应该有效。 在上面的答案中不确定为什么我们使用'r'。
您可以使用正则表达式解决此问题。
import re
string = 'version_4.11.2-2-1.4'
p=re.compile(r'\d+')
p.findall(string)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.