Python 正则匹配中的贪婪与非贪婪陷阱

9次阅读

.**? 是非贪婪匹配,遇结束符即停;.** 默认贪婪,会匹配到末尾。需根据需求选择模式,并优先用精确字符类替代 .*,避免回溯灾难和结构误解析。

Python 正则匹配中的贪婪与非贪婪陷阱

为什么 .* 总是匹配到末尾而不是最近的结束符

因为 .* 默认贪婪,它会尽可能多地吞掉字符,直到整个字符串末尾或无法继续匹配为止。比如想从 "start<a>text1</a>middle<a>text2</a>end" 中提取第一个 <a>...</a>,用 r'<a>.*</a>' 实际会匹配到 <a>text1</a>middle<a>text2</a> —— 它没停在第一个 ,而是跑到了最后一个。

解决方法很简单:在量词后加 ?,改成非贪婪模式。

  • .*? 匹配任意字符(除换行),但尽可能少
  • .*(无问号)是贪婪的,.*? 才是你真正想要的“遇到就停”行为
  • 注意:. 默认不匹配换行符,跨行需加 re.DOTALL 标志,否则 .*? 也会被换行卡住

re.findall 返回空列表?检查是否用了贪婪量词吃掉了分隔结构

常见于解析日志、HTML 片段或自定义标记时,比如用 re.findall(r'<div>(.*?)</div>', text) 却返回空——很可能是因为 text 中有嵌套 <div> 或中间混入了未转义的 <code>

text=ZqhQzanResources