捕获结果转字典
把一次匹配的分组结果整理成字典,是正则结果进入业务流程前最常见的一步:下游按字段名取值,不用关心正则在第几个括号。Python 的 groupdict 已经把这件事做好一半,剩下的是处理未参与组、空串与类型转换,以及决定哪些组不该进字典。
基本信息
| 最直接写法 | Python:m.groupdict();其余语言用组名列表与 groups() 手动 zip |
|---|---|
| 必做清洗 | 过滤未参与组(None 或 undefined),把空串与缺失值区分开 |
| 类型转换 | 在转字典这一步统一做 int、float、时间解析,避免下游各自处理 |
| 组名来源 | Python 可用 pattern.groupindex 拿到 名称到序号的映射 |
典型使用场景
- 日志入库:一行访问日志拆成字段名到值的映射,再批量写入表或时序库
- 配置与清单解析:从文本清单里抽出名称、数量、单位后交给下游校验
- 批量替换:把字典当作替换模板,字段缺失时按业务规则补默认值
- 数据清洗管道:先按行匹配成字典,再统一做类型转换与必填校验
- 结构化输出:直接序列化成 JSON 返回给调用方,字段名即接口契约
Python 落地写法
Python 落地写法
pat = re.compile(r'(?P<ip>\S+) - - \[(?P<ts>[^\]]+)\] "(?P<req>[^"]*)" (?P<status>\d{3})')
for line in open('access.log'):
m = pat.search(line) # 逐行匹配,拿到 Match 对象
if not m: # 不匹配的行要显式跳过,不要静默丢弃
continue
d = {k: v for k, v in m.groupdict().items() if v is not None} # 去掉未参与组
d['status'] = int(d['status']) # 类型转换集中在转字典这一步
yield d # 交给下游,字段名即契约三种转字典写法
| 写法 | 返回内容 | 适用场合 |
|---|---|---|
| groupdict() | 只含命名组的字典 | 模式写得规整,全部字段已命名 |
| zip(groupindex, groups()) | 命名组加序号映射 | 需要同时保留序号信息 |
| zip(组名列表, m.groups()) | 自定义字段名与顺序 | 模式里的组是别人维护的,不能改 |
尽量用非捕获组 (?:…) 包住不需要输出的可选片段,否则它们会以数字键的形式混进结果,下游要额外判断哪些键是有效字段。
空串与未参与是两种不同状态:字段匹配到了但内容为空,和字段整体没出现,在数据质量统计里含义完全不同,转字典时最好保留区分而不是统一成空值。