0

在python中,我试图使用正则表达式从字符串中获取多个输入;但是,我遇到了麻烦。对于字符串:

inputs       =    12 1  345 543 2

我尝试使用:

match = re.match(r'\s*inputs\s*=(\s*\d+)+',string)

但是,这仅返回 value '2'。我正在尝试捕获所有值'12','1','345','543','2',但不确定如何执行此操作。

任何帮助是极大的赞赏!

编辑:感谢大家解释为什么这不起作用并提供替代建议。对不起,如果这是一个重复的问题。

4

4 回答 4

2

你可以尝试类似的东西: re.findall("\d+", your_string).

于 2013-05-28T14:32:37.147 回答
1

您可以嵌入正则表达式:

import re
s = 'inputs       =    12 1  345 543 2'
print re.findall(r'(\d+)', re.match(r'inputs\s*=\s*([\s\d]+)', s).group(1))
>>> 
['12', '1', '345', '543', '2']

或者分层执行:

import re

def get_inputs(s, regex=r'inputs\s*=\s*([\s\d]+)'):
    match = re.match(regex, s)
    if not match:
        return False # or raise an exception - whatever you want
    else:
        return re.findall(r'(\d+)', match.group(1))

s = 'inputs       =    12 1  345 543 2'
print get_inputs(s)
>>> 
['12', '1', '345', '543', '2']
于 2013-05-28T14:48:07.453 回答
1

您不能使用单个正则表达式来执行此操作(除非您使用的是 .NET),因为每个捕获组即使重复也只会返回一个结果(Python 中的最后一个)。

由于可变长度的后视也是不可能的(在这种情况下您可以这样做(?<=inputs.*=.*)\d+),您必须将其分为两个步骤:

match = re.match(r'\s*inputs\s*=\s*(\d+(?:\s*\d+)+)', string)
integers = re.split(r'\s+',match.group(1))

因此,现在您捕获整个整数列表(以及它们之间的空格),然后在空格处拆分该捕获。

第二步也可以使用findall

integers = re.findall(r'\d+',match.group(1))

结果是相同的。

于 2013-05-28T14:35:18.743 回答
0

你应该看看这个答案:https ://stackoverflow.com/a/4651893/1129561

简而言之:

在 Python 中,使用单个正则表达式是不可能的:组的每次捕获都会覆盖同一组的最后一次捕获(在 .NET 中,这实际上是可能的,因为引擎区分捕获和组)。

于 2013-05-28T14:35:11.553 回答