Python中的正则表达式分组重复

2 投票
2 回答
776 浏览
提问于 2025-04-18 06:37
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'] 

撰写回答