正则表达式中的多个分组?

52 投票
4 回答
67488 浏览
提问于 2025-04-16 11:36

我在用Python返回多个分组的时候有点困惑。我的正则表达式是:

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

而我的字符串是

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

我得到了一个匹配的对象,然后想查看这些分组,但它只显示最后一个数字(258):

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

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

4 个回答

8

如果你想要的输出是像 0, 1, 2, 3, 4 这样的数字:

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

另一种方法是先用你已有的正则表达式来验证你的数据,然后再用一个更具体的正则表达式,针对你想提取的每个项目,使用匹配迭代器。

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
39

你的正则表达式里只有一对括号(一个捕获组),所以在匹配的时候只会得到一个组。如果你在捕获组上使用重复操作符(比如+*),那么每次这个组被重复的时候,之前的匹配结果会被“覆盖”,也就是说最后只会保留最后一次匹配的结果。

在你这个例子中,使用.split()结合正则表达式可能会更好:

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]

撰写回答