贪婪匹配模式与非贪婪匹配模式的区别

学习笔记 马富天 2019-06-21 16:27:49 10 0

【摘要】本文记录一下贪婪匹配和非贪婪匹配的区别,可能咋一听会有点蒙,但是实际上多运用就知道其中的区别其实可以明显的区分出来。

贪婪匹配:在成功匹配到字符的情况下,尽可能多的匹配字符,记住一点:贪婪一点,越长越好;

非贪婪匹配(也可以称为懒惰匹配):即在成功匹配到字符的情况下,尽可能少的匹配字符串,记住一点:不贪婪,越短越好。

请看如下的一个实例:

字符串:"ma(123)fu)tian ma(456)fu)tian" 为例,我们要查找括号 "()" 中的字符,在 python 中:

  1. import re
  2. string = "ma(123)fu)tian ma(456)fu)tian"
  3. # 贪婪匹配,匹配的结果是:['123)fu)tian ma(456)fu']
  4. res1   = re.findall(r"(.*)",string, re.S)
  5. # 非贪婪匹配,匹配的结果是:['123', '456']
  6. res2 = re.findall(r"(.*?)",string, re.S)

两种匹配方式匹配到的结果截然不同,贪婪匹配会尽最大的可能去查找满足条件的字符串,因为它的查找效率是较低的;而非贪婪匹配在匹配第一次成功后结束本次匹配,而 findall() 会匹配所有的 () 中的字符串。

对于贪婪模式和非贪婪模式的使用场景需要根据实际情况而定,假如我们要匹配一段字符串中所有超链接标签时,一般使用非贪婪匹配,如下:

  1. import re
  2. str = "<a href = 'http://www.mafutian.net'>天下第二</a> hello world <a href = 'http://www.baidu.com'>心碎小子</a>"
  3. res3 = re.findall(r"<a.*?>.*?</a>",str, re.S)
  4. # 匹配的结果是:
  5. # ["<a href = 'http://www.mafutian.net'>天下第二</a>", "<a href = 'http://www.baidu.com'>心碎小子</a>"]

然而当我们使用贪婪匹配时:

  1. res3 = re.findall(r"<a.*?>.*</a>",str, re.S)
  2. # 匹配的结果是:
  3. # ["<a href = 'http://www.mafutian.net'>天下第二</a> hello world <a href = 'http://www.baidu.com'>心碎小子</a>"]

另外:使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。

温故而知新,很多东西并不是三两天的时间学会了、理解了就能够终身不忘,最好的办法就是记录下来,然后闲时的时候再回过头来看看,会记忆的比较深刻。

版权归 马富天PHP博客 所有

本文标题:《贪婪匹配模式与非贪婪匹配模式的区别》

本文链接地址:http://www.mafutian.net/422.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

0

0

上一篇《 navicate 导出 csv 文件出现乱码的原因以及解决方式 》 下一篇《 mysql 索引类型简介 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多