我有行
[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)
答案 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()
在多组括号之间不匹配。或者您可以使用.*
而不是\[[^]]*\]
,这样它就不会与右括号匹配。
并且不需要围绕要捕获的部分的非捕获组。
只需使用:
.*
答案 2 :(得分:0)
在您的示例字符串中,第一个非捕获捕获组O(1)
将匹配,直到字符串结尾。然后它将回溯并捕获组2中的最后一个(?:.*)
和组3中的[50 +5]
。对于1
,没有其他字符可以匹配。
您可以使用匹配的否定字符类而不是.*
而不是贪婪的括号:
.*
说明
(\[[^][]+\])\s+(\d+)
第一个捕获组(
否定的字符类,以匹配\[[^][]+\]
,而不是[
或]
并匹配[
]
)
匹配1倍以上的空白字符(或仅使用空格)\s+
在第2组中捕获,匹配数字超过1次例如:
(\d+)