Python中的正则表达式分组重复
string = "input-ports 6012, 6017, 6016"
m = re.match("input-ports(\s\d{4},?)(\s\d{4},?)(\s\d{4},?)", string)
print m.groups #=> (' 6012,', ' 6017,', ' 6016')
但是当我想使用分组重复的时候,它只返回最后一个数字。
m = re.match("input-ports(\s\d{4},?)+", string)
print m.groups #=> (' 6016',)
有人能告诉我这是为什么吗?
2 个回答
5
传统的正则表达式引擎只记住并返回最后一次匹配的结果,但有一些高级的库提供了 captures
属性,可以保存给定组的所有匹配结果。Python 有一个叫做 regex
的库,它可以做到这一点,还有其他一些很不错的功能:
import regex
string = "input-ports 6012, 6017, 6016"
m = regex.match("input-ports(?:\s(\d{4}),?)+", string)
print m.captures(1) # ['6012', '6017', '6016']
如果你不能使用这个库,唯一的解决办法就是用 findall
方法,并通过前瞻来替换重复的部分成一个单独的组。这并不是总能做到,但你的例子比较简单:
import re
string = "input-ports 6012, 6017, 6016"
m = re.findall("(?<=\s)\d{4}(?=,|$)", string)
print m # ['6012', '6017', '6016']