Python 分组结果的读取方法
匹配对象的取值接口围绕组展开:按序号取、按名字取、一次性取全部、取位置区间、按模板展开。最容易踩的坑是未参与匹配的组返回的是空值而不是空字符串,直接参与拼接或数值运算都会出问题。命名组在取值时仍占序号,插入新组会让序号整体漂移。
基本信息
| 按序号取 | group(1)、group(1, 2);序号从 1 开始,0 表示整段匹配 |
|---|---|
| 按名字取 | group('name')、groupdict(),后者返回名称到值的字典 |
| 位置区间 | start、end、span 可传组号或组名,返回字符下标 |
| 模板展开 | expand 接受替换模板,按组引用填充内容 |
典型使用场景
- 结构化提取:一次匹配取多个字段,按名字读出后组装成记录
- 替换回写:把匹配到的片段按模板重新组织,例如格式转换与掩码
- 定位与高亮:用位置区间在原文上做标注或截取上下文
- 数据校验:判断某个组是否参与,从而确认输入命中了哪个可选分支
- 调试模式:打印 groups 与 groupdict 快速看清各组的实际取值
取值接口示例
取值接口示例
import re
m = re.search(r'(?P<x>a)?(?P<y>b)', 'b')
m.group('y') # 'b':按名字取值
m.groups() # (None, 'b'):未参与的组是 None,不是空串
m.groupdict() # {'x': None, 'y': 'b'}
m.lastindex, m.lastgroup # 最后参与匹配的组号与组名
m.span('y') # (0, 1):该组在原文中的位置区间
re.search(r'(\d)-(\d)', '3-7').group(2) # 按序号取第二组
re.search(r'(?P<n>\w+)', 'abc').expand(r'[\g<n>]') # 按模板展开接口与返回
| 接口 | 返回内容 | 说明 |
|---|---|---|
| group() | 整段匹配 | 等同组号 0 |
| group(n, m) | 元组 | 按给定组号或组名依次取值 |
| groups() | 元组 | 按序号列出全部捕获组 |
| groupdict() | 字典 | 只包含命名组 |
| span(n) | 起止下标 | 可用于切片与高亮 |
| expand(tpl) | 字符串 | 按模板展开,引用可写序号或组名 |
命名组同样占用序号:模式里出现一个命名组后,后续普通组的序号会顺延,混用序号与名字取值时最容易被这种偏移绊倒,取值统一用名字可以规避。
非捕获组不占序号也不出现在结果里,适合包住可选片段与量词作用范围;不确定是否需要该分组时优先写非捕获形式,能显著减少取值代码里的判空分支。