我的输入字符串是:
{(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')]
答案 0 :(得分:0)
这里的解决方案(我之前的错误):
metric_matches = re.findall(r'\[\((\w+)\)\((\w+)\)\((\d+)\)\]', metrics_line)
结果将是:
[('mapper_init', 'mapper_init', '1'), ('mapper_input_lines', 'mapper_input_lines', '102571')]
正如您所见,括号留在那里,但+
已删除。
答案 1 :(得分:0)
似乎有不必要的最外(
)
括号和+
。我不确定你的正则表达式的要求和其他输入案例,但是这个正则表达式会在这种情况下产生你想要的东西:
>>> metric_matches = re.findall('\[\((\w+)\)\((\w+)\)\((\d+)\)\]', metrics_line)
>>> [('mapper_init', 'mapper_init', '1'), ('mapper_input_lines', 'mapper_input_lines', '102571')]
如果元组中的第一个值不重要,那么您可以忽略它:
>>> metric_matches = re.findall('\[\(\w+\)\((\w+)\)\((\d+)\)\]', metrics_line)
>>> [('mapper_init', '1'), ('mapper_input_lines', '102571')]