博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】本文记录一下贪婪匹配和非贪婪匹配的区别,可能咋一听会有点蒙,但是实际上多运用就知道其中的区别其实可以明显的区分出来。
贪婪匹配:在成功匹配到字符的情况下,尽可能多的匹配字符,记住一点:贪婪一点,越长越好;
非贪婪匹配(也可以称为懒惰匹配):即在成功匹配到字符的情况下,尽可能少的匹配字符串,记住一点:不贪婪,越短越好。
请看如下的一个实例:
字符串:"ma(123)fu)tian ma(456)fu)tian" 为例,我们要查找括号 "()" 中的字符,在 python 中:
import re
string = "ma(123)fu)tian ma(456)fu)tian"
# 贪婪匹配,匹配的结果是:['123)fu)tian ma(456)fu']
res1 = re.findall(r"(.*)",string, re.S)
# 非贪婪匹配,匹配的结果是:['123', '456']
res2 = re.findall(r"(.*?)",string, re.S)
两种匹配方式匹配到的结果截然不同,贪婪匹配会尽最大的可能去查找满足条件的字符串,因为它的查找效率是较低的;而非贪婪匹配在匹配第一次成功后结束本次匹配,而 findall() 会匹配所有的 () 中的字符串。
对于贪婪模式和非贪婪模式的使用场景需要根据实际情况而定,假如我们要匹配一段字符串中所有超链接标签时,一般使用非贪婪匹配,如下:
import re
str = "<a href = 'http://www.mafutian.net'>天下第二</a> hello world <a href = 'http://www.baidu.com'>心碎小子</a>"
res3 = re.findall(r"<a.*?>.*?</a>",str, re.S)
# 匹配的结果是:
# ["<a href = 'http://www.mafutian.net'>天下第二</a>", "<a href = 'http://www.baidu.com'>心碎小子</a>"]
然而当我们使用贪婪匹配时:
res3 = re.findall(r"<a.*?>.*</a>",str, re.S)
# 匹配的结果是:
# ["<a href = 'http://www.mafutian.net'>天下第二</a> hello world <a href = 'http://www.baidu.com'>心碎小子</a>"]
另外:使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。
温故而知新,很多东西并不是三两天的时间学会了、理解了就能够终身不忘,最好的办法就是记录下来,然后闲时的时候再回过头来看看,会记忆的比较深刻。
版权归 马富天个人博客 所有
本文标题:《贪婪匹配模式与非贪婪匹配模式的区别》
本文链接地址:http://www.mafutian.com/422.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0
评论审核未开启 |
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||