Python正则分组核心是用()定义可提取、复用、命名的子表达式,包括基础捕获组、非捕获组(?:...)、反向引用\1、命名组(?P...)及嵌套组合,支撑文本解析与高级替换。

Python 中的正则表达式分组与捕获,核心在于用圆括号 () 定义子表达式,让匹配结果可提取、可复用、可命名。它不只是“把内容括起来”,而是控制匹配逻辑、组织返回结构、支撑高级替换的关键机制。
基础分组:用括号提取关键片段
默认情况下,每个 () 构成一个捕获组,re.search 或 re.findall 会按组顺序返回匹配内容。
-
re.search(r'(\d{4})-(\d{2})-(\d{2})', '2023-12-25')返回三个组:'2023'、'12'、'25' -
re.findall(r'(\w+)=(\d+)', 'a=1,b=2,c=3')返回列表:[('a','1'), ('b','2'), ('c','3')],每项是元组 - 非捕获组
(?:...)不保存结果,只用于逻辑分组,比如r'(?:https?://)?(\w+\.\w+)'只捕获域名
反向引用:在模式中复用已捕获内容
用 \1、\2 等引用前面第 n 个捕获组的**实际匹配文本**,常用于检测重复、配对或格式一致性。
-
r'(\w+)\s+\1'匹配连续两个相同单词,如'hello hello' -
r'(.*?)\1>'匹配成对 HTML 标签(不推荐解析 HTML,仅作示例),\1确保闭合标签与开头一致 - 注意:反向引用匹配的是“文本”,不是模式;若组未参与匹配(如含
?且未出现),引用可能失效
命名捕获组:用名字代替数字,提升可读性与维护性
写成 (?P,后续可用 match.group('name') 或 match.groupdict() 获取,避免数序号出错。
立即学习“Python免费学习笔记(深入)”;
re.search(r'(?P\d{4})-(?P \d{2})-(?P \d{2})', '2023-04-01') -
match.group('year')→'2023';match.groupdict()→{'year':'2023', 'month':'04', 'day':'01'} - 命名组也支持反向引用:
(?P,\w+)>(.*?)(?P=tag) (?P=tag)表示复用同名组内容
嵌套与组合:处理多层结构的实用技巧
复杂文本(如日志、配置、代码片段)常需多级分组配合量词和分支。关键是理清优先级和边界。
- 避免过度嵌套:先用非捕获组
(?:...)组织逻辑,再在外层加命名捕获 - 结合
|使用时注意分组范围:r'(cat|dog)s?'捕获整个单词;r'(cat|dog)(s?)'分开捕获种类和复数标记 - 用
re.VERBOSE写长模式:允许换行、空格和注释,大幅提升可读性,例如解析带单位的数值r'''(?P\d+(?:\.\d+)?)\s+(?P kg|g|ml|L)'''
分组与捕获不是炫技工具,而是让正则从“是否匹配”走向“如何理解文本”的桥梁。掌握括号的类型、引用方式和命名习惯,就能稳住大多数解析场景。










