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',)
任何人都可以告诉我它为什么会这样?
答案 0 :(得分:3)
注意:重复捕获组仅捕获最后一次迭代。 将捕获组放在重复组周围以捕获所有组 迭代或使用非捕获组,如果你不是 对数据感兴趣
on regex101
答案 1 :(得分:2)
虽然传统的正则表达式引擎只记住并返回最后一个匹配项,但一些高级库提供captures
属性,该属性保存给定组的所有匹配项。有一个名为regex
的库用于python,除了其他好处之外:
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']