在singe行中使用regex在python中进行多次搜索

时间:2019-02-26 17:32:31

标签: regex python-3.x

我有行

[0 +5] 23 for bucket [5 +5] 1 for bucket [25 +5] 22 for bucket [50 +5] 1

使用reqex我想要类似

的结果
[('[0 +5]', '23'), ('[5 +5]', '1'), ('[25 +5] ','22'), ('[50 +5]', 1)] 

但低于结果

[('[50 +5]', '1')]

使用过:

stats_iter = re.findall('(?:.*)(?:(\[.*\]) (\d+)).*', stat_log,re.DOTALL)
print(stats_iter)

3 个答案:

答案 0 :(得分:1)

*中继器是贪婪的,因此通过将(?:.*)作为正则表达式的第一部分,它将消耗除最后一个匹配项以外的所有内容。您应该使用正则表达式来匹配您需要的部分:

re.findall('(\[.*?\]) (\d+)', stat_log)

答案 1 :(得分:1)

正则表达式末尾的

'#:run! [.* at the beginning of the regexp causes the first match to include the entire beginning of the input string, up to the first。*`导致第一个匹配项包括其余的输入字符串。

因此,这两者都阻止了regexp多次匹配。使用. And时不应使用它们。

然后,您需要使用非贪婪量词,以使re.findall()在多组括号之间不匹配。或者您可以使用.*而不是\[[^]]*\],这样它就不会与右括号匹配。

并且不需要围绕要捕获的部分的非捕获组。

只需使用:

.*

DEMO

答案 2 :(得分:0)

在您的示例字符串中,第一个非捕获捕获组O(1)将匹配,直到字符串结尾。然后它将回溯并捕获组2中的最后一个(?:.*)和组3中的[50 +5]。对于1,没有其他字符可以匹配。

您可以使用匹配的否定字符类而不是.*而不是贪婪的括号:

.*

说明

  • (\[[^][]+\])\s+(\d+) 第一个捕获组
  • (否定的字符类,以匹配\[[^][]+\],而不是[]并匹配[
  • ]
  • )匹配1倍以上的空白字符(或仅使用空格)
  • \s+在第2组中捕获,匹配数字超过1次

regex demo | Python demo

例如:

(\d+)