You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中带通配符的正则表达式如何获取所有匹配捕获分组

问题原因

Python标准库re模块的正则引擎中,被重复量词(*/+/{m,n}等)修饰的捕获组,默认只会存储最后一次匹配的内容,之前匹配到的内容会被直接覆盖。你写法中外层非捕获组带*量词,每匹配到一组新的字母+数字组合,就会覆盖两个捕获组之前存储的值,最终调用groups()只能拿到最后一组('c', '3')。

可行实现方案

方案1:使用标准库re.findall(推荐,无额外依赖)

不要给捕获组外层套重复量词,直接匹配所有符合规则的子串,再将结果扁平化即可得到预期输出:

import re

match_list = re.findall(r'([a-z]+) ([0-9]+)', ' a 1 b 2 c 3')
# 把列表里的元组展开为一维元组
result = tuple(item for group in match_list for item in group)
print(result)  # 输出: ('a', '1', 'b', '2', 'c', '3')

这个方案适配绝大多数同结构重复匹配的场景,逻辑直观不需要安装第三方包,是日常开发的首选。

方案2:使用第三方regex库获取重复捕获组全量结果

如果你需要保持单次匹配的写法,可以用功能更丰富的第三方正则库regex,它支持记录重复捕获组的所有匹配内容,需要先通过pip install regex安装:

import regex

res = regex.match(r'(?: ([a-z]+) ([0-9]+))*', ' a 1 b 2 c 3')
all_captures = []
# 遍历所有捕获组,取出每组的全量匹配结果
for group_idx in range(1, len(res.groups()) + 1):
    all_captures.extend(res.captures(group_idx))
print(tuple(all_captures))  # 输出: ('a', '1', 'b', '2', 'c', '3')
注意事项

写提取类正则时,如果需要保留捕获组的全部匹配内容,不要把捕获组放在被重复量词修饰的括号结构内部,否则就会出现旧匹配结果被覆盖的问题。

内容的提问来源于stack exchange,提问作者Yuebo Guo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:48:24