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

Tom*_*ace 63 python regex

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

这是我提出的表达方式:

([\+-][a-zA-Z0-9]+)*
Run Code Online (Sandbox Code Playgroud)

如果我使用这种模式搜索字符串'-56 + a',我希望得到两个匹配:

+ a和-56

但是,我只返回了最后一场比赛:

>>> m = re.match("([\+-][a-zA-Z0-9]+)*", '-56+a')
>>> m.groups()
('+a',)
Run Code Online (Sandbox Code Playgroud)

看看python文档,我看到:

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

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

所以,我的问题是:如何您可以访问多个小组赛?

pho*_*oji 58

*从正则表达式中删除(因此它只与您的模式的一个实例匹配).然后使用re.findall(...)re.finditer(参见此处)返回所有匹配项.

更新:

听起来你实际上是在构建一个递归下降解析器.对于相对简单的解析任务,手动执行此操作是非常常见且完全合理的.如果您对库解决方案感兴趣(例如,以后您的解析任务可能会变得更复杂),请查看pyparsing.

  • 是的,不幸的是,在我的情况下,字符串中的位置是相关的.字符串的一部分中的"+ a"可能意味着另一部分中的某些内容完全不同.谢谢. (2认同)

Eri*_*ric 28

regex模块通过添加.captures方法修复此问题:

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

  • 这个答案比目前接受的答案更简单地解决了我的问题.`regex`模块也应该在将来取代Python`re`模块. (4认同)
  • 这是什么黑魔法! (3认同)