正则表达式组在python中重复

时间:2014-05-15 05:23:35

标签: python regex

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 个答案:

答案 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']