Python的正则expression式:如何访问一个组的多个匹配?

我正在制定一个相当复杂的正则expression式。 expression式的一部分匹配诸如“+ a”,“-57”等的string。A +或a – 后跟任意数量的字母或数字。 我想匹配0个或更多匹配这个模式的string。

这是我提出的expression:

([\+-][a-zA-Z0-9]+)* 

如果我要使用这种模式searchstring'-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' 

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

在此先感谢您的帮助。

汤姆

从你的正则expression式中删除* (所以它恰好匹配你的模式的一个实例)。 然后使用re.findall(...)re.finditer (请参阅此处 )返回所有匹配项。

更新:

这听起来像你本质上是build立一个recursion下降parsing器 。 对于相对简单的parsing任务来说,手工完成这是相当普遍和完全合理的。 如果您对库解决scheme感兴趣(例如,稍后parsing任务可能会变得更加复杂),请参阅pyparsing 。

regex模块通过添加一个.captures方法来解决这个问题:

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