Python 正则表达式:如何访问组的多个匹配项?

Python 正则表达式:如何访问组的多个匹配项?,python,regex,Python,Regex,我正在整理一个相当复杂的正则表达式。表达式的一部分匹配字符串,如“+a”、“-57”等。a+或a-后跟任意数量的字母或数字。我想匹配0个或多个与此模式匹配的字符串 这是我想到的表达方式: ([\+-][a-zA-Z0-9]+)* 如果使用此模式搜索字符串'-56+a',我希望得到两个匹配项: +a和-56 但是,我只返回了最后一个匹配项: >>> m = re.match("([\+-][a-zA-Z0-9]+)*", '-56+a') >>&

我正在整理一个相当复杂的正则表达式。表达式的一部分匹配字符串,如“+a”、“-57”等。a+或a-后跟任意数量的字母或数字。我想匹配0个或多个与此模式匹配的字符串

这是我想到的表达方式:

([\+-][a-zA-Z0-9]+)*
如果使用此模式搜索字符串'-56+a',我希望得到两个匹配项:

+a和-56

但是,我只返回了最后一个匹配项:

>>> m = re.match("([\+-][a-zA-Z0-9]+)*", '-56+a')
>>> m.groups()
('+a',)
查看python文档,我发现:

如果组匹配多次,则只能访问最后一个匹配:

>>> m = re.match(r"(..)+", "a1b2c3")  # Matches 3 times.
>>> m.group(1)                        # Returns only the last match.
'c3'

所以,我的问题是:如何访问多个组匹配?

从正则表达式中删除
*
(这样它正好匹配您模式的一个实例)。然后使用
re.findall(…)
re.finditer
(请参阅)返回所有匹配项

更新:

听起来你基本上是在建造一个。对于相对简单的解析任务,手工进行解析是非常常见且完全合理的。如果您对库解决方案感兴趣(例如,如果以后您的解析任务可能会变得更复杂),请查看。

通过添加
。捕获
方法解决此问题:

>>> m = regex.match(r"(..)+", "a1b2c3")
>>> m.captures(1)
['a1', 'b2', 'c3']

谢谢你的回复。问题是,我问题中的表达式只是一个更长表达式的一部分。我试图标记用户输入的字符串。我想我可能必须采取“分而治之”的方法,断开字符串中包含表达式这一部分标识的组的部分,然后按照您的建议应用re.findall。再次感谢你的帮助!值得注意的是,re.findall(pattern,string)将查找字符串中所有出现的模式,即使这些出现是非连续的。也就是说:re.findall('a.','axayaz')==re.findall('a.','--ax--ay--az--')==['ax','ay','az']是的,不幸的是,在我的例子中,字符串中的位置是相关的。”+字符串的一部分中的“a”在另一部分中可能意味着完全不同的东西。谢谢。@Tom:我已经添加了一些更高级的链接到答案。如果这回答了您的问题,请向上投票(绿色复选标记/向上箭头)将此问题标记为已解决。谢谢这些链接phooji-非常有趣。我已把你的回答标为已接受。谢谢大家!这个答案比目前公认的答案更简单地解决了我的问题。
regex
模块也应该在将来取代Python
re
模块。这是什么黑魔法!