讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬磊君_5560

冬磊君_5560

发布时间:2026-02-16 13:19:27

|

515人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

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

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

更可靠的做法不是靠正则硬啃结构,而是明确边界条件:

立即学习“Python免费学习笔记(深入)”;

361SCAN security check your skill python scripts
361SCAN security check your skill python scripts

扫描并分析已安装技能,用于查看指定技能目录的名称、描述和详情,或列出所有已安装的技能。

下载
  • 如果目标内容不含 <,可用 r'<div>([^<]*)</div>' 替代 .*?,避免误判
  • 若含标签但层级简单,优先用 re.search 配合 group(1) 取单个结果,比 findall 更可控
  • re.findall 对非贪婪匹配敏感:多个重叠匹配不会被返回,它只按从左到右、不重叠的方式切片

性能差异:贪婪 vs 非贪婪在长文本中可能差出一个数量级

表面上只是多打个 ?,但底层回溯机制完全不同。贪婪模式先“冲到底”,再一步步往回退;非贪婪则是“走一步看一步”。当文本很长、模式又模糊(比如 .* 前后都宽松)时,贪婪容易触发灾难性回溯。

例如匹配 "a" * 10000 + "b" 中的 a*b,用 r'a*b' 很快,但用 r'a*?b' 在某些引擎下反而更慢——因为非贪婪要反复试探每个位置是否能“刚好够用”。

  • 真实场景中,优先写精确字符类,比如 [^"]* 比 .*? 快且安全
  • 避免在嵌套结构里用 .*? 套 .*?,比如 r'<tag attr="(.*?)">(.*?)</tag>',一旦属性值里出现引号就崩
  • 用 re.compile 缓存正则对象,尤其在循环中多次调用时,能省下编译开销

Python 3.11+ 的 re 引擎对非贪婪支持更稳,但别依赖它绕过设计缺陷

旧版 Python(如 3.7)在极端回溯场景下可能抛 re.error: bad escape 或直接卡死,新版做了优化,但本质没变:正则仍是线性扫描+有限回溯。

真正该警惕的是把正则当解析器用:

  • HTML/XML 请用 BeautifulSoup 或 xml.etree.ElementTree,别用 re.findall(r'<p>(.*?)</p>')
  • JSON、YAML、配置文件等结构化数据,一律走专用解析器,正则只处理原子字段(比如提取某一行里的 IP 地址)
  • 非贪婪不是万能补丁,它是权衡——换来的简洁性,常以可读性、可维护性和边界鲁棒性为代价

最常被忽略的一点:非贪婪只作用于它紧邻的量词,.*? 不会“传染”给前面的字符或后面的分组。写复杂表达式时,建议用 re.DEBUG 看实际编译结构,比猜靠谱得多。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2135

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3262

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1096

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3719

2025.09.10

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

673

2023.11.13

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4544

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

5897

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2462

2024.11.28

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn