Python正则表达式贪婪模式与非贪婪模式原理及用法详解
本文深入解析Python中正则表达式的贪婪与非贪婪模式。通过代码实例说明默认贪婪模式会匹配尽可能多的字符,而在量词后添加问号可启用非贪婪模式,匹配最少字符。文章结合源码分析,解释*?、+?等忽略优先量词的工作原理,帮助开发者准确控制正则匹配行为。
Python正则表达式贪婪与非贪婪模式概述
本文详细介绍Python中正则表达式里贪婪模式与非贪婪模式的运作原理及具体应用方法,供读者参考学习。
贪婪模式与代码实例分析
初次接触正则表达式时,阅读Python网络爬虫源码中的正则匹配代码可能会感到困惑。例如以下代码片段:
myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)
对于“.*?”这种匹配模式,直观理解是匹配任意字符0次或多次(在re.S模式下,“.”也能匹配“\n”)。但这里的“?”似乎显得多余,因此通过编写测试代码来验证其实际效果:
import re
patern = re.compile('www\..*')
match1 = patern.match("www.baidu.com")
if match1:
print(match1.group())
else:
print("match1 don't match")
#output
>>> ==================RESTART =============================
>>>
www.baidu.com
上述运行结果符合预期。那么,如果在量词后加上“?”会发生什么?
import re
patern = re.compile('www\..*?')
match1 = patern.match("www.baidu.com")
if match1:
print(match1.group())
else:
print("match1 don't match")
#output
>>> ==================RESTART =============================
>>>
www.
结果出乎意料。“.?”竟然没有匹配到任何字符。按照“.”、“*”、“?”的常规逻辑,它们都匹配前一个字符0次,理应得到空结果,但这里为何直接匹配0次?
非贪婪模式原理与量词详解
这涉及正则表达式中的贪婪模式与非贪婪模式概念:
- 贪婪模式:总是尝试匹配尽可能多的字符;
- 非贪婪模式:相反,总是尝试匹配尽可能少的字符。
Python中的数量词默认采用贪婪模式,这解释了第一个实验输出“www.baidu.com”(贪婪模式)。第二个实验之所以不同,仅仅是因为添加了“?”,即切换为非贪婪模式。我们继续通过实验验证:
import re
patern = re.compile('www\..?')
match1 = patern.match("www.baidu.com")
if match1:
print(match1.group())
else:
print("match1 don't match")
#output
>>> ==================RESTART =============================
>>>
www.b
此次匹配结果再次显示为贪婪模式。令人疑惑的是,只有“?”的特殊组合才能触发非贪婪模式。
查阅相关资料后,得到如下解释:
标准量词修饰的子表达式在可匹配可不匹配的情况下,优先尝试匹配,这种方式称为匹配优先或贪婪模式。之前介绍的数量词如“{m}”、“{m,n}”、“{m,}”、“?”、“*”和“+”均属于匹配优先。部分NFA正则引擎支持忽略优先量词,即在标准量词后加“?”。此时,在可匹配可不匹配的情况下,优先忽略匹配,只有当忽略优先量词修饰的子表达式必须参与匹配才能使整个表达式成功时,才会进行匹配,这种方式称为忽略优先或非贪婪模式。忽略优先量词包括“{m}?”、“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。
由此可见,“*?”组合确实属于非贪婪模式,猜想得到证实。
正则表达式辅助工具推荐
此外,推荐两款实用的正则表达式工具供参考:
JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascript
正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg
如需了解更多Python相关知识,可查看本站系列文章:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望本文内容对大家的Python编程有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













