1 模式概述
贪婪模式:默认情况下,匹配重复的元字符总是尽可能多地向后匹配内容。 懒惰模式:也称非贪婪模式,让匹配重复的元字符尽可能少地向后匹配内容。 共同之处:都是建立在匹配成功的基础上的。 相关元字符:*
、+
、?
、{m}
、{m,n}
从贪婪模式转化为懒惰模式:在相关元字符后加上?
,表示使用懒惰模式进行匹配。
2 例子
2.1 贪婪模式例子
import re
re. findall( r'ab*' , "abbbbbbbbbcd" )
re. findall( r'ab+' , "abbbbbbbbbcd" )
re. findall( r'ab?' , "abbbbbbbbbcd" )
re. findall( r'ab{3}' , "abbbbbbbbbcd" )
re. findall( r'ab{3,5}' , "abbbbbbbbbcd" )
2.2 懒惰模式例子
import re
re. findall( r'ab*?' , "abbbbbbbbbcd" )
re. findall( r'ab+?' , "abbbbbbbbbcd" )
re. findall( r'ab??' , "abbbbbbbbbcd" )
re. findall( r'ab{3}?' , "abbbbbbbbbcd" )
re. findall( r'ab{3,5}?' , "abbbbbbbbbcd" )
2.3 对比
上述例子能较好且较简单地理解贪婪与懒惰模式的功能,对于一些较复杂的字符串,想要清晰判断贪婪模式与懒惰模式的输出结果就有点难度了。 比如下述例子,在贪婪模式下,因为尽可能多地匹配内容,因此只判断了起终点两个中括号;在懒惰模式下,识别的是每一对中括号。
import re
s = '[花千古],[陆贞传奇],[新还珠格格],[楚乔传]'
re. findall( r'\[.+\]' , s)
re. findall( r'\[.+?\]' , s)
3 总结
理解贪婪模式与懒惰模式的差异; 掌握两种模式的用法; 能理解上述语句的结果是容易的,但是当出现类似需求时能否用正则表达式简洁表达就需要勤加练习了。
参考文献
1.《RE正则表达式模块(Python视频教程) 》