之前已经简单介绍了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小时内与您取得联系。