Python regex不匹配多个组

2024-04-24 06:55:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我的输入字符串是:

{(metrics)(metrics)[(mapper_init)(mapper_init)(1)][(mapper_input_lines)(mapper_input_lines)(102571)]}

当我运行以下代码时:

metric_matches = re.findall('(\[\(\w+\)\((\w+)\)\((\d+)\)\])+', metrics_line)

print "Processing: %s" % metrics_line
print metric_matches

我得到:

Processing: {(metrics)(metrics)[(mapper_init)(mapper_init)(1)][(mapper_input_lines)(mapper_input_lines)(102571)]}
[('[(mapper_input_lines)(mapper_input_lines)(102571)]', 'mapper_input_lines', '102571')]

为什么两组都不匹配?我想让它匹配:

[(__not-important__, 'mapper_init', 1), (__not-important__, 'mapper_input_lines', '102571')]

Tags: 字符串代码reinputinitlinenotmetric
2条回答

似乎有不必要的最外层()括号和+。我不确定您的正则表达式的要求和其他输入情况,但在这种情况下,此正则表达式将生成您想要的:

>>> metric_matches = re.findall('\[\((\w+)\)\((\w+)\)\((\d+)\)\]', metrics_line)

>>> [('mapper_init', 'mapper_init', '1'), ('mapper_input_lines', 'mapper_input_lines', '102571')]

如果tuple中的第一个值不重要,则可以忽略它,如下所示:

>>> metric_matches = re.findall('\[\(\w+\)\((\w+)\)\((\d+)\)\]', metrics_line)

>>> [('mapper_init', '1'), ('mapper_input_lines', '102571')]

以下是解决方法(我在上一个中有输入错误):

metric_matches = re.findall(r'\[\((\w+)\)\((\w+)\)\((\d+)\)\]', metrics_line)

结果将是:

[('mapper_init', 'mapper_init', '1'), ('mapper_input_lines', 'mapper_input_lines', '102571')]

正如您可以看到的,括号保留在那里,但是+被删除了。你知道吗

相关问题 更多 >