首页 文章

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

提问于
浏览
53

这个问题在这里已有答案:

我正在整理一个相当复杂的正则表达式 . 表达式的一部分匹配字符串,例如'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”)#匹配3次 .

m.group(1)#仅返回最后一场比赛 .
'C3'

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

在此先感谢您的帮助 .

汤姆

2 回答

  • 22

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

    Update:

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

  • 54

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

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

相关问题