这篇文章主要介绍了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)

【相关推荐】

python贪婪匹配和非贪婪匹配_Python关于正则贪婪与非贪婪特性的详解相关推荐

  1. python列表切片后得到剩余列表_python列表切片和嵌套列表取值操作详解

    python列表切片和嵌套列表取值操作详解 给出列表切片的格式: [开头元素::步长] # 输出直到最后一个元素,(最后一个冒号和步长可以省略,下同) [开头元素:结尾元素(不含):步长] # 其中, ...

  2. python更新数据库表的时间字段_python更新数据库中某个字段的数据(方法详解)

    连接数据库基本操作,我把每一步的操作是为什么给大家注释一下,老手自行快进. 请注意这是连接数据库操作,还不是更新. import pymysql #导包 #连接数据库 db = pymysql.con ...

  3. python读取文件夹下所有文件名_python如何获取当前文件夹下所有文件名详解

    前言 本文主要给大家介绍了关于python获取当前文件夹下所有文件名的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 os 模块下有两个函数: os.walk() os.li ...

  4. python两个装饰器执行顺序_python中多个装饰器的执行顺序详解

    装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...

  5. 学python开发必须要会wsgi么_python Web开发你要理解的WSGI uwsgi详解

    WSGI协议 首先弄清下面几个概念: WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web ...

  6. python中如何创建一个空列表_Python创建空列表的字典2种方法详解

    如果要在 Python 中创建键值是空列表的字典,有多种方法,但是各种方法之间是否由区别?需要作实验验证,并且分析产生的原因.本文针对两种方法做了实验和分析. 如果要在 Python 中创建一个键值都 ...

  7. python实现qq登录腾讯视频_Python爬取腾讯视频评论的思路详解

    一.前提条件 安装了Fiddler了(用于抓包分析) 谷歌或火狐浏览器 如果是谷歌浏览器,还需要给谷歌浏览器安装一个SwitchyOmega插件,用于代理服务器 有Python的编译环境,一般选择Py ...

  8. python重要库的导入和使用_python重要第三方库pandas加载数据(详解)

    Pandas数据加载 关注公众号"轻松学编程"了解更多. pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,其中read_csv和read_table这两个 ...

  9. python装饰器性能_python装饰器的特性原理详解

    这篇文章主要介绍了python装饰器的特性原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天发现了装饰器的另一种用法,下面就先上代码: d ...

  10. [Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

最新文章

  1. Pyhton 内置 itertools 模块chain、accumulate、compress、drop、take等函数使用
  2. 研究阿里钉钉近三年,我们总结了10大企业级产品的营销套路
  3. html:(21):重置按钮和label标签
  4. 介绍某现金贷平台的决策规则
  5. 8.3 折特惠票仅剩 5 天!「2019 嵌入式智能国际大会」全日程大公开!
  6. python标准库time_python标准库介绍——12 time 模块详解
  7. array(numpy) 的size 和Image(PIL) 的shape比较
  8. C# .NET 如何修改代码字体
  9. JavaWeb项目练习(一)——客户信息管理系统
  10. C++ Primer 中文版(第 5 版)练习解答合集
  11. 蓝桥杯python组——明码
  12. html embed如何禁止自动播放,html embed用法
  13. 玩平衡小车系列—TB6612FNG与直流电机控制教程
  14. Flutter 之页面状态保持
  15. 前端开发笔记:记一次网站创建的过程
  16. Windows10压缩卷时可压缩空间远小于实际剩余空间的解决方案
  17. java 时区id对应时区名称,Java 可以或失去的全部的时区ID
  18. Redis 之 SessionCallback RedisCallback 使用
  19. 手机ufs2.1测试软件,都UFS 2.1了 你还不赶紧把TF卡扔掉!-手机评测
  20. linux忘记密码修改密码_如何更改我的Linux密码

热门文章

  1. IIoT可预测运维报告摘要 1
  2. 当 TiDB 遇上 Flink:TiDB 高效入湖“新玩法” | TiLaker 团队访谈
  3. ABAP 关键字:PARAMETERS
  4. API 帮产品度过瓶颈期
  5. 网络安全难学吗?怎么系统学习网络安全?
  6. 模拟退火算法——概率法解全局优化
  7. Autosar Dcm模块介绍
  8. 学习stm32f103c8t6,如何从正点原子官网下载资料及资料使用
  9. 路径规划 | 图解概率路图PRM原理及其参数分析
  10. 2018会考计算机成绩查询,2018会考成绩在哪里查询 会考成绩有用吗