Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取字符串中数值列表的最干净方法_Python_String - Fatal编程技术网

Python 获取字符串中数值列表的最干净方法

Python 获取字符串中数值列表的最干净方法,python,string,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 ' '

获取字符串中数值列表的最干净方法是什么

例如:

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()]
奇怪的是,我还没有找到答案,所以:

  • ,则假定输入数值由空格分隔
  • ,则假定输入数值由空格分隔
  • ,用户只要求在字符串开头输入一个数值
  • ,用户只要求所有串联数字的单个数值

谢谢

只需在连续数字上匹配即可:

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()
将为您提供一个iterable
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 answer清楚地显示的那样,Regex无疑是最好的方法,但是如果您不想使用它,您可能无法使用列表理解。不过,您可以这样做:

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)

谢谢我正在使用Python 2。因此,我认为(也从所有其他答案中)内置函数所能实现的功能已经不多了,
re
是最干净的解决方案。对吗?@barakmanos
re
是标准库的一部分,请将其视为内置库。是的,这是针对你的具体问题的最干净的解决方案。我认为它并不比我在回答中已经有的好多少。无论如何,谢谢。你需要测试一个余数;除非后面跟的是非数字,否则您将错过字符串中的最后一个数字。@MartijnPieters:这是一个我没有注意到的错误,但现在已经修复了。谢谢