此问题已在此处有答案:
RegEx with multiple groups?(4个答案)
5年前关闭。
我正在组合一个相当复杂的正则表达式。表达式的一部分匹配字符串,如'+ 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'
所以我的问题是如何访问多个组匹配?
2条答案
按热度按时间vtwuwzda1#
从正则表达式中删除
*
(这样它就可以精确匹配模式的一个示例)。然后使用re.findall(...)
或re.finditer
(参见here)返回所有匹配项。听起来你实际上是在构建一个recursive descent parser。对于相对简单的解析任务,手工完成这个任务是很常见的,也是完全合理的。如果你对一个库解决方案感兴趣(例如,万一你的解析任务在以后变得更加复杂),可以看看pyparsing。
slwdgvem2#
regex
module通过添加.captures
方法解决了这个问题: