全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python正则表达式教程之三:贪婪/非贪婪特性

之前已经简单介绍了Python正则表达式的基础与捕获,那么在这一篇文章里,我将总结一下正则表达式的贪婪/非贪婪特性。 

贪婪

默认情况下,正则表达式将进行贪婪匹配。所谓“贪婪”,其实就是在多种长度的匹配字符串中,选择较长的那一个。例如,如下正则表达式本意是选出人物所说的话,但是却由于“贪婪”特性,出现了匹配不当:

>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'"(.*)"', sentence)
['why?" and I say "I don\'t know']

再比如,如下的几个例子都说明了正则表达式“贪婪”的特性:

>>> re.findall('hi*', 'hiiiii')
['hiiiii']
>>> re.findall('hi{2,}', 'hiiiii')
['hiiiii']
>>> re.findall('hi{1,3}', 'hiiiii')
['hiii']

非贪婪

当我们期望正则表达式“非贪婪”地进行匹配时,需要通过语法明确说明: 

      {2,5}?    捕获2-5次,但是优先次数少的匹配

在这里,问号?可能会有些让人犯晕,因为之前他已经有了自己的含义:前面的匹配出现0次或1次。其实,只要记住,当问号出现在表现不定次数的正则表达式部分之后时,就表示非贪婪匹配。 

还是上面的那几个例子,用非贪婪匹配,则结果如下:

>>> re.findall('hi*?', 'hiiiii')
['h']
>>> re.findall('hi{2,}?', 'hiiiii')
['hii']
>>> re.findall('hi{1,3}?', 'hiiiii')
['hi']

另外一个例子中,使用非贪婪匹配,结果如下:

>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'"(.*?)"', sentence)
['why?', "I don't know"]

捕获与非贪婪

严格来说,这一部分并不是非贪婪特性。但是由于其行为与非贪婪类似,所以为了方便记忆,就将其放在一起了。 

      (?=abc) 捕获,但不消耗字符,且匹配abc

      (?!abc) 捕获,不消耗,且不匹配abc

在正则表达式匹配的过程中,其实存在“消耗字符”的过程,也就是说,一旦一个字符在匹配过程中被检索(消耗)过,后面的匹配就不会再检索这一字符了。 

知道这个特性有什么用呢?还是用例子说明。比如,我们想找出字符串中出现过1次以上的单词:

>>> sentence = "Oh what a day, what a lovely day!"
>>> re.findall(r'\b(\w+)\b.*\b\1\b', sentence)
['what']

这样的正则表达式显然无法完成任务。为什么呢?原因就是,在第一个(\w+)匹配到what,并且其后的\1也匹配到第二个what的时候,“Oh what a day, what”这一段子串都已经被正则表达式消耗了,所以之后的匹配,将直接从第二个what之后开始。自然地,这里只能找出一个出现了两次的单词。 

那么解决方案,就和上面提到的(?=abc)语法相关了。这样的语法可以在分组匹配的同时,不消耗字符串!所以,正确的书写方式应该是:

>>> re.findall(r'\b(\w+)\b(?=.*\b\1\b)', sentence)
['what', 'a', 'day']

如果我们需要匹配一个至少包含两个不同字母的单词,则可以使用(?!abc)的语法:

>>> re.search(r'([a-z]).*(?!\1)[a-z]', 'aa', re.IGNORECASE)
>>> re.search(r'([a-z]).*(?!\1)[a-z]', 'ab', re.IGNORECASE)
<_sre.SRE_Match object; span=(0, 2), match='ab'>

总结

以上就是Python正则表达式中关于贪婪的全部内容了,希望本文的内容对大家的学习或者使用python能能带来一定的帮助,如果有疑问大家可以留言交流,如果有疑问大家可以留言交流。下一篇文章,我会继续总结一下Python正则表达式re模块的一些API的用法,请继续关注。


# 正则表达式  # 贪婪  # 非贪婪  # python正则表达式教程  # python re模块匹配贪婪和非贪婪模式详解  # python贪婪匹配以及多行匹配的实例讲解  # python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析  # python正则表达式的懒惰匹配和贪婪匹配说明  # 这一  # 与非  # 过程中  # 自己的  # 出现了  # 几个  # 在这里  # 我会  # 第一个  # 在这  # 就不  # 是由  # 出现在  # 两次  # 将其  # 下一  # 第二个  # 有疑问  # 都说 


相关文章: 建站主机解析:虚拟主机配置与服务器选择指南  如何在建站之星绑定自定义域名?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  ,sp开头的版面叫什么?  c# 在ASP.NET Core中管理和取消后台任务  重庆网站制作公司哪家好,重庆中考招生办官方网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站之星安装后如何配置SEO及设计样式?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  javascript中的try catch异常捕获机制用法分析  已有域名如何免费搭建网站?  javascript中对象的定义、使用以及对象和原型链操作小结  如何快速上传自定义模板至建站之星?  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何选择最佳自助建站系统?快速指南解析优劣  如何用wdcp快速搭建高效网站?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  湖北网站制作公司有哪些,湖北清能集团官网?  ,在苏州找工作,上哪个网站比较好?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何快速搭建FTP站点实现文件共享?  宿州网站制作公司兴策,安徽省低保查询网站?  表情包在线制作网站免费,表情包怎么弄?  南宁网站建设制作定制,南宁网站建设可以定制吗?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  建站之星如何快速更换网站模板?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  ,网站推广常用方法?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  想学网站制作怎么学,建立一个网站要花费多少?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何在IIS服务器上快速部署高效网站?  简单实现Android文件上传  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  个人网站制作流程图片大全,个人网站如何注销?  如何在服务器上配置二级域名建站?  微信小程序 五星评分(包括半颗星评分)实例代码  Android自定义控件实现温度旋转按钮效果  哈尔滨网站建设策划,哈尔滨电工证查询网站?  招商网站制作流程,网站招商广告语?  定制建站方案优化指南:企业官网开发与建站费用解析  如何获取上海专业网站定制建站电话?  如何彻底卸载建站之星软件? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。