获取字符串中数值列表的最简洁方法是什么?
例如:
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上找到答案:
由于
答案 0 :(得分:6)
只匹配连续数字:
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)]
答案 1 :(得分:5)
我也用正则表达式来解决这个问题。
我更喜欢re.finditer
而不是re.findall
来执行此任务。 re.findall
返回一个列表,re.finditer
返回一个迭代器,所以使用这个解决方案你不会创建一个临时的字符串列表:
>>> [int(x.group()) for x in re.finditer('\d+', string)]
[4, 11, 2, 2, 1, 4]
答案 2 :(得分:0)
正则表达式绝对是@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
答案 3 :(得分:0)
您正在跟踪每个角色并检查它是否为数字,如果是,则将其添加到列表中,对较大的字符串变慢。
让我们说,
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'。
答案 4 :(得分:0)
您可以使用正则表达式解决此问题。
import re
string = 'version_4.11.2-2-1.4'
p=re.compile(r'\d+')
p.findall(string)