问题现象
想提取两个标签之间的内容,结果匹配从第一个标签一直延伸到最后一个,中间内容全被吞掉。
原因分析
量词默认贪婪,会尽可能多地匹配,直到字符串末尾才回溯。判断时先分清是 正则贪婪匹配 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。
处理步骤
- 把量词改为非贪婪形式
- 用排除型字符组限制范围
- 改用解析库处理结构化文本更稳
对应的命令或配置片段如下,可直接复制:
import re s = '<p>第一段</p><p>第二段</p>' print(re.findall(r'<p>(.*?)</p>', s)) print(re.findall(r'<p>([^<]*)</p>', s))
改动前把原配置备份一份,出问题时能马上回退,比现场找原因省时间。排查时把每一步的输出留下来,后面再遇到同类问题,对照日志就能判断是哪一层先出错的。
验证结果
提取结果按段落分组,每段内容互不包含,数量与标签对数一致。