regexes:如何访问组的多个匹配项?[重复]

x7rlezfr  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(72)

此问题已在此处有答案

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'

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

vtwuwzda

vtwuwzda1#

从正则表达式中删除*(这样它就可以精确匹配模式的一个示例)。然后使用re.findall(...)re.finditer(参见here)返回所有匹配项。
听起来你实际上是在构建一个recursive descent parser。对于相对简单的解析任务,手工完成这个任务是很常见的,也是完全合理的。如果你对一个库解决方案感兴趣(例如,万一你的解析任务在以后变得更加复杂),可以看看pyparsing

slwdgvem

slwdgvem2#

regex module通过添加.captures方法解决了这个问题:

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

相关问题