最短匹配模式

问题

你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配。而你想修改它变成查找最短的可能匹配。

解法

这个问题一般出现在需要匹配一对分隔符之间的文本的时候 (比如引号包含的字符串)。为了说明清楚,考虑如下的例子:

>>> str_pat = re.compile(r'\"(.*)\"')
>>> text1 = 'Computer says "no."'
>>> str_pat.findall(text1)
['no.']
>>> text2 = 'Computer says "no." Phone says "yes."'
>>> str_pat.findall(text2)
['no." Phone says "yes.']
>>>

在这个例子中,模式 r'n"(.*)n"' 的意图是匹配被双引号包含的文本。但是在正则表达式中 * 操作符是贪婪的,因此匹配操作会查找最长的可能匹配。于是在第二个例子中搜索 text2 的时候返回结果并不是我们想要的。

为了修正这个问题,可以在模式中的 * 操作符后面加上? 修饰符,就像这样:

>>> str_pat = re.compile(r'\"(.*?)\"')
>>> str_pat.findall(text2)
['no.', 'yes.']
>>>

这样就使得匹配变成非贪婪模式,从而得到最短的匹配,也就是我们想要的结果。

讨论

本文展示了在写包含点 (.) 字符的正则表达式的时候遇到的一些常见问题。在一个模式字符串中,点 (.) 匹配除了换行外的任何字符。然而,如果你将点 (.) 号放在开始与结束符 (比如引号) 之间的时候,那么匹配操作会查找符合模式的最长可能匹配。

这样通常会导致很多中间的被开始与结束符包含的文本被忽略掉,并最终被包含在匹配结果字符串中返回。通过在 * 或者 + 这样的操作符后面添加一个 ? 可以强制匹配算法改成寻找最短的可能匹配。

《Python Cookbook 3rd》笔记(2.7):最短匹配模式相关推荐

  1. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  2. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  3. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  4. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  5. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  6. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  7. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  8. python模式匹配算法_详解Python 最短匹配模式

    问题 你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配. 而你想修改它变成查找最短的可能匹配. 解决方案 这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字 ...

  9. 《Python Cookbook 3rd》笔记(2.8):多行匹配模式

    多行匹配模式 问题 你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配. 解法 这个问题很典型的出现在当你用点 (.) 去匹配任意字符的时候,忘记了点 (.) 不能匹配换行符的事实.比 ...

最新文章

  1. html文件怎么用Python做后端,利用python实现后端写网页(flask框架).pdf
  2. 蓝桥杯 大臣的旅费(Java dfs)
  3. hive sql 怎么实现循环_python怎么实现循环
  4. 类库dll引用不成功问题
  5. Knockout 官网学习文档目录
  6. 最长公共子字符串(动态规划)
  7. 【渝粤题库】广东开放大学 公共部门人力资源管理 形成性考核
  8. PHP使用 uEditor富文本编辑器
  9. CSDN博客积分标准,包括博客勋章等
  10. 考研数学一【高数】 第18讲多元函数积分学
  11. java 局域网广播_java UDP实现局域网广播 | 学步园
  12. 线性代数及其应用(第三版)1.3节习题解答
  13. webmax的剪切面和正对相机设置 图例
  14. 深度学习笔记----拓扑结构动态变化网络(Dropout,Drop Connect, Stochastic Depth, BranchyNet,Blockdrop,SkipNet)
  15. 单片机入门——流水灯介绍
  16. 统计基础:3.3_假设检验之t检验(Student‘s t test)
  17. Geforce 错误代码 ERROR CODE:0x0003问题方法
  18. JavaWeb项目开发案例精粹-第4章博客网站系统-003Dao层
  19. 三极管原理及贴片封装注意
  20. SVD 与 LSI教程(5):LSI关键字研究与协同理论

热门文章

  1. 设计模式C++实现(3)——建造者模式
  2. shell 脚本比较字符串相等_比较带空格的字符串相等的Shell脚本 如何比较两个.....
  3. linux 分区 文件,Linux的分区与文件结构
  4. 【转】SVN各种颜色状态
  5. 访问网络共享时出现“拒绝访问”
  6. 【MOSS】快速调试Sharepoint站点
  7. oracle 游标 904,如何解决Oracle数据库游标连接超出问题
  8. 少年自学python笔记_自学python 笔记
  9. golang 包含 数组_Golang数组类型
  10. 设计模式(五)行为型模式