获取字符串中数值列表的最简洁方法

时间:2016-03-28 12:08:46

标签: python 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上找到答案:

由于

5 个答案:

答案 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)