Python RegEx多个组

我很困惑返回Python中的多个组。 我的RegEx是这样的:

lun_q = 'Lun:\s*(\d+\s?)*' 

而我的string是

 s = '''Lun: 0 1 2 3 295 296 297 298'''` 

我返回一个匹配的对象,然后想看看这些组,但是它显示了最后一个数字(258):

 r.groups() (u'298',) 

为什么不返回0,1,2,3,4等组?

你的正则expression式只包含一对括号(一个捕获组),所以你只能得到一个组。 如果在捕获组( +* )上使用重复操作符,则每次重复该组时,该组将被“覆盖”,这意味着只捕获最后的匹配。

在你的例子中,你最好使用.split()和一个正则expression式:

 lun_q = 'Lun:\s*(\d+(?:\s+\d+)*)' s = '''Lun: 0 1 2 3 295 296 297 298''' r = re.search(lun_q, s) if r: luns = r.group(1).split() # optionally, also convert luns from strings to integers luns = [int(lun) for lun in luns] 

有时候,它更容易没有正则expression式。

 >>> s = '''Lun: 0 1 2 3 295 296 297 298''' >>> if "Lun: " in s: ... items = s.replace("Lun: ","").split() ... for n in items: ... if n.isdigit(): ... print n ... 0 1 2 3 295 296 297 298 

另一种方法是使用正则expression式来validation数据,然后使用一个更具体的正则expression式来针对你想使用匹配迭代器提取的每个项目。

 import re s = '''Lun: 0 1 2 3 295 296 297 298''' lun_validate_regex = re.compile(r'Lun:\s*((\d+)(\s\d+)*)') match = lun_validate_regex.match(s) if match: token_regex = re.compile(r"\d{1,3}") match_iterator = token_regex.finditer(match.group(1)) for token_match in match_iterator: #do something brilliant 

如果你正在寻找一个输出,如0,1,2,3,4等简单的答案如下。

print re.findall('\ d',s)