使用正则表达式在字符串中抓取多个模式

时间:2013-05-28 14:29:28

标签: python regex

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

inputs       =    12 1  345 543 2

我尝试使用:

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

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

非常感谢任何帮助!

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

4 个答案:

答案 0 :(得分:2)

您可以尝试以下方式: re.findall("\d+", your_string)

答案 1 :(得分: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))

结果完全相同。

答案 2 :(得分: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']

答案 3 :(得分:0)

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

简而言之:

  

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