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

为什么 .* 总是匹配到末尾而不是最近的结束符
因为 .* 默认贪婪,它会尽可能多地吞掉字符,直到整个字符串末尾或无法继续匹配为止。比如想从 "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>