嵌套时读到什么
嵌套分组里,外层组的内容覆盖内层组,也就是内层捕获到的片段同时是外层结果的一部分。判读顺序是先数左括号定编号,再从外到内看范围,最后核对每个组的起止位置是否与预期一致。
范围是包含关系
外层组可能比内层长,也可能相等,但绝不会更短。遇到结果看起来「短了一截」时,通常是把内层编号当成了外层,或模式里还藏着容易忽略的括号,例如断言内部的捕获括号。
基本信息
| 编号规则 | 按左括号出现顺序,外层先于内层 |
|---|---|
| 范围关系 | 外层范围包含内层,可相等时表示两层匹配同一片段 |
| 可读取内容 | 匹配文本、起止位置、是否为未参与匹配状态 |
| 未参与匹配 | 可选分支未命中时该组为空值,与匹配到空串不同 |
| 检查手段 | 先看组数量,再逐组打印内容与位置,比对照整体结果更快定位 |
典型使用场景
- 解析多段结构:整体捕获一份,内部各段分别捕获
- 从日志行里同时取出请求方法、路径与状态码
- 校验结构化标识并抽取其中一段做后续处理
- 排查替换结果错位:逐步打印各组范围确认编号
- 把长模式拆成若干内层组,提升可读性与可维护性
嵌套分组的读取
嵌套分组的读取
import re
m = re.search(r'((\d{4})-(\d{2})-(\d{2}))', '2026-10-17')
print(m.group(1)) # 最外层:整段日期
print(m.group(2)) # 内层第一段:年份
print(m.groups()) # 一次性查看全部捕获内容
print(m.span(1)) # 外层的起止区间
print(m.span(2)) # 内层区间被包含在外层区间之内
print(len(m.groups())) # 先确认组数量,再决定怎么引用嵌套层级读法
| 组号 | 对应括号 | 内容范围 |
|---|---|---|
| 1 | 最外层左括号 | 整段日期,范围最大 |
| 2 | 第二个左括号 | 年份,被组 1 完全包含 |
| 3 | 第三个左括号 | 月份,与年份并列 |
| 4 | 第四个左括号 | 日期,与前面各段并列 |
判断组有没有命中比判断内容更重要。未参与匹配的组在很多语言里返回空值而不是空串,直接拼接或比较会抛出异常,先判空再使用是稳妥做法。
嵌套层数超过两三层后,数字编号会变得难以维护。此时改成命名分组,让读取代码直接写名字,模式调整时也不容易连带出错。