我正在整理一个相当复杂的正则表达式。表达式的一部分与字符串匹配,例如’+ 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'
如果一个组多次匹配,则只能访问最后一个匹配项:
>>> m = re.match(r"(..)+", "a1b2c3") # Matches 3 times. >>> m.group(1) # Returns only the last match. 'c3'
所以,我的问题是:如何 做 您可以访问多个小组赛?
*从您的正则表达式中删除(因此它与您的模式的一个实例完全匹配)。然后使用re.findall(...)或re.finditer(请参阅此处)返回所有匹配项。
*
re.findall(...)
re.finditer
更新:
听起来您实际上是在构建递归下降解析器。对于相对简单的解析任务,手工完成是相当普遍且完全合理的。如果您对库解决方案感兴趣(例如,以后解析任务可能变得更复杂),请查看pyparsing。