繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM