网站首页 > java教程 正文
点击头像,进入个人中心,查看文章合集,还有更多Python相关的精彩教程等着你!
在前几章中,我们学习了正则的 基础语法、分组、Flags。
本章我们要解决一个常见问题:
为什么正则有时候会“匹配太多”?
4.1 什么是贪婪匹配?
正则默认是 贪婪(Greedy)模式:
- 在满足条件的情况下,会尽可能多地匹配内容。
示例:
import re
text = "<div>hello</div><div>world</div>"
pattern = r"<div>.*</div>"
match = re.search(pattern, text)
print(match.group())
输出:
<div>hello</div><div>world</div>
问题:它把两个 <div> 一起吞掉了。
4.2 什么是非贪婪匹配?
非贪婪(Lazy/Non-Greedy)模式:
- 在满足条件的情况下,尽可能少地匹配。
- 通过在量词后加 ? 实现。
示例:
import re
text = "<div>hello</div><div>world</div>"
pattern = r"<div>.*?</div>" # 加了 ?
matches = re.findall(pattern, text)
print(matches)
输出:
['<div>hello</div>', '<div>world</div>']
4.3 常见量词的贪婪 vs 非贪婪
贪婪(默认) | 非贪婪 |
* —— 尽可能多 | *? —— 尽可能少 |
+ —— 尽可能多 | +? —— 尽可能少 |
? —— 0 或 1(贪婪时尽量匹配 1) | ?? —— 0 或 1(非贪婪时尽量匹配 0) |
{m,n} —— 匹配 m 到 n 次,尽量多 | {m,n}? —— 匹配 m 到 n 次,尽量少 |
4.4 示例:提取引号中的内容
import re
text = 'He said "hello" and "world".'
# 贪婪
print(re.findall(r'"(.*)"', text))
# ['hello" and "world']
# 非贪婪
print(re.findall(r'"(.*?)"', text))
# ['hello', 'world']
4.5 示例:解析 HTML 标签
import re
html = "<p>first</p><p>second</p>"
# 贪婪
print(re.findall(r"<p>.*</p>", html))
# ['<p>first</p><p>second</p>']
# 非贪婪
print(re.findall(r"<p>.*?</p>", html))
# ['<p>first</p>', '<p>second</p>']
4.6 图示对比
字符串:
<p>abc</p><p>def</p>
- 贪婪匹配 <p>.*</p>
<p>abc</p><p>def</p>
^^^^^^^^^^^^^^^^^^^
一次性吞掉所有
- 非贪婪匹配 <p>.*?</p>
<p>abc</p><p>def</p>
^^^^^^^^^
^^^^^^^^^
逐个匹配
4.7 小练习
请尝试写出正则,完成以下任务:
- 从字符串 "The prices are $5, $10, and $100" 中提取所有美元金额(数字部分即可)。
- 从文本 "<title>My Page</title><title>Your Page</title>" 中提取所有 <title> 标签的内容。
- 用一个正则,提取 "aaabbbccc" 中 连续的相同字母分组,结果应为 ['aaa','bbb','ccc']。
本章你学到了:
- 默认正则是 贪婪模式
- ? 可以把量词变为 非贪婪模式
- 贪婪 vs 非贪婪在实际解析 HTML/XML、引号内容时非常重要
下一章(第 5 章),我们会学习 正则表达式中的零宽断言(前后查找),掌握更强大的匹配控制力。
猜你喜欢
- 2025-09-24 30个Excel/WPS新公式实战大全,效率翻倍不是梦!
- 2025-09-24 Ngnix的server_name正则匹配执行顺序
- 2025-09-24 学习VBA,报表做到飞 第四章 正则表达式 4.12 正则表达式与数组结合
- 2025-09-24 用正则表达式解代数方程_用正则表达式解代数方程怎么写
- 2025-09-24 Django路由配置方法全解_请简述django的url路由流程
- 2025-09-24 这几种正则表达式的“字符集合”,想要入门regexp函数,必须了解
- 2025-09-24 玩转Spring中强大的spel表达式!_spring的scope有几种
- 2025-09-24 Python中使用正则表达式_python 正则表达
- 2025-09-24 5分钟掌握Python(十六)之正则表达式
- 2025-09-24 学习VBA,报表做到飞 第四章 正则表达式 4.3 正则表达式的方法和属性
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)