全网整合营销服务商

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

免费咨询热线: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正则表达式的懒惰匹配和贪婪匹配说明  # 这一  # 与非  # 过程中  # 自己的  # 出现了  # 几个  # 在这里  # 我会  # 第一个  # 在这  # 就不  # 是由  # 出现在  # 两次  # 将其  # 下一  # 第二个  # 有疑问  # 都说 


相关文章: 网站建设制作、微信公众号,公明人民医院怎么在网上预约?  网站制作的步骤包括,正确网址格式怎么写?  如何快速搭建FTP站点实现文件共享?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  网站制作免费,什么网站能看正片电影?  如何选择香港主机高效搭建外贸独立站?  C#如何使用XPathNavigator高效查询XML  大连网站制作公司哪家好一点,大连买房网站哪个好?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  建站主机选哪家性价比最高?  如何在阿里云虚拟主机上快速搭建个人网站?  如何配置WinSCP新建站点的密钥验证步骤?  如何用免费手机建站系统零基础打造专业网站?  红河网站制作公司,红河事业单位身份证如何上传?  如何快速生成高效建站系统源代码?  建站之星代理商如何保障技术支持与售后服务?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  建站主机选择指南:服务器配置与SEO优化实战技巧  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  Python多线程使用规范_线程安全解析【教程】  如何在阿里云高效完成企业建站全流程?  建站之星云端配置指南:模板选择与SEO优化一键生成  如何在阿里云完成域名注册与建站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  如何将凡科建站内容保存为本地文件?  如何在Tomcat中配置并部署网站项目?  h5在线制作网站电脑版下载,h5网页制作软件?  如何高效配置香港服务器实现快速建站?  常州自助建站工具推荐:低成本搭建与模板选择技巧  网站网页制作专业公司,怎样制作自己的网页?  如何自定义建站之星网站的导航菜单样式?  制作网站的模板软件,网站怎么建设?  建站主机选虚拟主机还是云服务器更好?  建站主机系统SEO优化与智能配置核心关键词操作指南  如何选择适配移动端的WAP自助建站平台?  如何设置并定期更换建站之星安全管理员密码?  如何用y主机助手快速搭建网站?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  建站之星备案流程有哪些注意事项?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  定制建站哪家更专业可靠?推荐榜单揭晓  如何用好域名打造高点击率的自主建站?  建站主机服务器选购指南:轻量应用与VPS配置解析  北京网站制作网页,网站升级改版需要多久?  如何做静态网页,sublimetext3.0制作静态网页?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  山东网站制作公司有哪些,山东大源集团官网?  威客平台建站流程解析:高效搭建教程与设计优化方案  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站? 

您的项目需求

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