Python正则分组核心在于是否保存匹配结果:捕获组(()或(?P...))保存内容供group()提取,非捕获组(?:...)仅控制逻辑不保存、不编号。
Python正则中的分组核心在于控制匹配结构和提取内容,关键区别在于“是否保存匹配结果供后续使用”——捕获组会把括号内匹配的内容存进
,非捕获组只参与匹配逻辑,不保存。
捕获组:用括号包裹,自动编号,能取值
最基础的分组方式,一对圆括号
就是一个捕获组。Python 按左括号出现顺序从 1 开始编号(group(0) 是整个匹配)。
例如
匹配
,
得
,
是
,
是
支持命名捕获组:
,之后可用
直接取值,更清晰可读
重复使用的捕获组(如
)中
表示引用第一个捕获组的**实际匹配内容**(不是模式),用于匹配重复字符串
非捕获组:仅分组逻辑,不占编号,不存结果
语法为
,它让括号内的子表达式具备分组能力(比如配合量词或分支),但不会生成独立 group 编号,也不影响其他捕获组的序号。
例如
中
表示“匹配 http、https 或 ftp”,但不单独捕获协议名,避免无意义占位
搭配量词更实用:
匹配连续的
,若写成
虽然也匹配,但
只返回最后一次(
),而
不产生干扰,便于专注主匹配
在复杂正则里混用时,非捕获组能保持捕获组编号稳定,方便维护和引用
常见误区与注意事项
分组嵌套、编号规则和性能容易踩坑,需特别注意:
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
嵌套捕获组按左括号顺序编号,与层级无关。例如
中,外层是 group(1),内层
是 group(2),
是 group(3)
非捕获组
内不能再用命名捕获;但命名捕获组本身可以嵌套非捕获组
大量使用捕获组会略微增加内存开销和匹配耗时,纯做逻辑分组时优先选
对含捕获组的模式,**默认只返回捕获组内容**(单个组返回字符串列表,多个组返回元组列表);想返回完整匹配,得把整个模式包进一个捕获组,或改用
实战小技巧:快速判断该用哪种分组
问自己两个问题:
后续是否需要通过
或
提取这部分内容?→ 是,用普通捕获组(或命名组)
只是为了让
、
、
等作用于多个字符,或提升可读性?→ 否,用
不确定要不要捕获?先写非捕获组,后期需要再改成命名组,避免重构编号
group()()r'(\d{4})-(\d{2})-(\d{2})''2023-12-25'match.group(1)'2023'group(2)'12'group(3)'25'r'(?P\d{4})-(?P\d{2})-(?P\d{2})' match.group('year')(\d+),\s+\1\1(?:...)r'(?:https?|ftp)://\S+'(?:https?|ftp)r'(?:ab)+''ababab'(ab)+group(1)'ab'(?:ab)+((a)(b))(a)(b)(?:...)(?:...)re.findall()re.finditer()group()findall()|+*(?:...)