高级用法在这里:正则表达式(三)——高级用法:search,findall,sub,split

8.贪婪与非贪婪模式

首先我们以简单的例子来说说什么是正则表达式的贪婪与非贪婪匹配?

比如假定匹配字符串和正则表达式为:

>>> match_str = 'abcdefc'  #匹配字符串
  •  贪婪匹配:
>>> pattern = r'ab.*c'
>>> re.match(pattern,match_str)
<_sre.SRE_Match object; span=(0, 7), match='abcdefc'>

正则表达式一般趋向于最大长度匹配,总是尝试匹配尽可能多的字符,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcdefc。当出现c时,它还是继续向后找,又找到c,它就把cdef当做是(.*)的匹配

  • 非贪婪匹配
>>> pattern = r'ab.*?c'  #非贪婪匹配
>>> re.match(pattern,match_str)
<_sre.SRE_Match object; span=(0, 3), match='abc'>

非贪婪匹配就是匹配到结果就好,总是尝试匹配尽可能少的字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc。当它遇见c后,它就停止查找,此时把空字符作为(.*)的匹配。

那么贪婪与非贪婪怎么区分呢?

re模块默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。

我们熟知的量词有:

* 任意多个
+ 至少一个
0或1个
{m,n} m到n个

在上一节中的去除HTML中的标签时,我们使用r'<.+>'去匹配得到的却是一堆'\n',我们来看看原因。拿其中的一行来看,为什么输出'\n':

<p><br/></p>

分析:sub函数先做匹配操作,再做替换操作。在匹配操作时,首先匹配 <(左尖括号),<p>的<就已经匹配到,当匹配到<p>的>时,匹配未结束,它继续往后匹配。当匹配到<br/>的>时,仍然未结束,贪婪的向后继续匹配,直到匹配到</p>的>,再继续去匹配,字符串后面有个‘\n',结束匹配,它就把  p><br/></p 这些内容都当做 .+ 来处理。因此匹配到这一行内容除了'\n',并进行替换操作,替换为空字符'',因此输出'\n'。因此,在 .+ 后面加上?表示非贪婪模式,当碰到<p>的 > 就停止此次匹配。

>>> re.sub(r'<.+?>','',s) 

至此,正则表达式的学习就告一段落了,还是需要在实践中才能检验出真理......

正则表达式(四)——贪婪与非贪婪模式相关推荐

  1. 正则表达式之 贪婪与非贪婪模式详解

    1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NF ...

  2. 转:正则表达式之 贪婪与非贪婪模式详解

    1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配.非贪婪模式只被部分NF ...

  3. 正则表达式口诀及常用正则 。正则贪婪与非贪婪模式

    正则表达式口诀及常用正则 签于网上太多的介绍都是一篇凶悍的短文,边看边理解可以,帮助记忆不行.又受五笔字型字根表口诀"白手看头三二斤..."的启发,  试作"正则表达式助 ...

  4. 正则表达式贪婪与非贪婪模式

    正则表达式贪婪与非贪婪模式 之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:Stri ...

  5. 关于正则表达式的贪婪与非贪婪模式 - A JavaScript Fancier - IT博客网

    以前看正则表达式,但没有注意到正则表达式的贪婪与非贪婪模式,今天在经典上看到了这么段代码: <script> try{ str=" abcdefg abcdefghijkl &q ...

  6. 94. 正则表达式贪婪与非贪婪模式的区别?

    正则表达式,爬虫地时候用的比较多吧,暂时还没有接触过写爬虫地代码,先放下 写好正则表达式也是个不容易的事啊 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="abcaxc& ...

  7. java正则表达式非贪婪_正则表达式贪婪与非贪婪模式(示例代码)

    之前做程序的时候看到过正则表达式的贪婪与非贪婪模式,今天用的时候就想不起来了,现在这里总结一下,以备自己以后用到注意. 1.什么是正则表达式的贪婪与非贪婪匹配 如:String str="a ...

  8. 正则表达式的贪婪和非贪婪模式

    最近在写程序时,碰到一个场景,需要找到一个字符串中指定的一个片段,而不是所有片段,这就涉及到正则表达式中贪婪和非贪婪两种模式. 字面意思上,正则表达式一般趋向于最大长度匹配,就是贪婪模式.匹配到结果就 ...

  9. java正则表达式非贪婪_正则表达式中的贪婪与非贪婪匹配模式

    1.首先看看下面的例子: try{ str=" abcdefg abcdefghijkl "; re1=str.match(/ [\W\w]+?/ig); alert(" ...

最新文章

  1. 11岁少女叫板支付宝!会写代码的孩子,到底多可怕?
  2. 程序员整理的各种不错的工具
  3. 【算法基础】数据结构导论第四章-树.pptx
  4. 08.suggester02term_suggester
  5. Opencv 找轮廓并画出相应的矩形
  6. Anaconda+Win10安装
  7. mysql中常见错误代码汇总
  8. java 连接mongodb
  9. 3 上传分段_陕西|杨凌职业技术学院3+2分段制高职招生啦!
  10. 计算机平面设计论文范,计算机平面设计论文关于计算机平面设计中汉字艺术论文范文参考资料...
  11. Java数组去重的方法
  12. 面向模式的软件体系结构
  13. 169、多数元素(python)
  14. 产品经理日常工作之流程图
  15. 财会行业男女薪资比例matlab,2004:会计师事务所薪资调查分析报告
  16. 短除法(求最大公约数)
  17. 如何在2022年建立自己的NFT市场平台
  18. 棒球·飞盘·MLB棒球创造营
  19. 【雅虎2017】一个在线展示广告的CVR预估框架实践
  20. 【HTML基础-1】HTML标签简介及常用标签

热门文章

  1. 一文讲明白以太坊上交易类型含义、作用、发展过程
  2. Access.2007宝典(奋斗的小鸟)_PDF 电子书
  3. 如何删除插入U盘报Copy of Shortcut to 这种病毒
  4. seajs动态加载js原理_seaJS 模块加载过程分析
  5. hackthebox-Tracks-CREST_CRT-Squashed
  6. 请问你知道为什么关系型数据库要叫关系型数据库吗?
  7. 异步多线程之ThreadPool详解
  8. 转载 汉字转拼音,比Excel的 VBA强,Excel出来的结果还有错的。
  9. 传智播客大讲堂隆重开讲
  10. 学习stm32f103c8t6,如何从正点原子官网下载资料及资料使用