《Python Cookbook 3rd》笔记(2.7):最短匹配模式
最短匹配模式
问题
你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配。而你想修改它变成查找最短的可能匹配。
解法
这个问题一般出现在需要匹配一对分隔符之间的文本的时候 (比如引号包含的字符串)。为了说明清楚,考虑如下的例子:
>>> 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):最短匹配模式相关推荐
- 《Python Cookbook 3rd》笔记汇总
文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...
- 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素
<Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...
- 《Python cookbook》笔记二
<Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...
- Python Cookbook 3rd Edition Documentation
Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...
- Machine Learning with Python Cookbook 学习笔记 第8章
Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...
- Machine Learning with Python Cookbook 学习笔记 第9章
Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- python模式匹配算法_详解Python 最短匹配模式
问题 你正在试着用正则表达式匹配某个文本模式,但是它找到的是模式的最长可能匹配. 而你想修改它变成查找最短的可能匹配. 解决方案 这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字 ...
- 《Python Cookbook 3rd》笔记(2.8):多行匹配模式
多行匹配模式 问题 你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配. 解法 这个问题很典型的出现在当你用点 (.) 去匹配任意字符的时候,忘记了点 (.) 不能匹配换行符的事实.比 ...
最新文章
- html文件怎么用Python做后端,利用python实现后端写网页(flask框架).pdf
- 蓝桥杯 大臣的旅费(Java dfs)
- hive sql 怎么实现循环_python怎么实现循环
- 类库dll引用不成功问题
- Knockout 官网学习文档目录
- 最长公共子字符串(动态规划)
- 【渝粤题库】广东开放大学 公共部门人力资源管理 形成性考核
- PHP使用 uEditor富文本编辑器
- CSDN博客积分标准,包括博客勋章等
- 考研数学一【高数】 第18讲多元函数积分学
- java 局域网广播_java UDP实现局域网广播 | 学步园
- 线性代数及其应用(第三版)1.3节习题解答
- webmax的剪切面和正对相机设置 图例
- 深度学习笔记----拓扑结构动态变化网络(Dropout,Drop Connect, Stochastic Depth, BranchyNet,Blockdrop,SkipNet)
- 单片机入门——流水灯介绍
- 统计基础:3.3_假设检验之t检验(Student‘s t test)
- Geforce 错误代码 ERROR CODE:0x0003问题方法
- JavaWeb项目开发案例精粹-第4章博客网站系统-003Dao层
- 三极管原理及贴片封装注意
- SVD 与 LSI教程(5):LSI关键字研究与协同理论
热门文章
- 设计模式C++实现(3)——建造者模式
- shell 脚本比较字符串相等_比较带空格的字符串相等的Shell脚本 如何比较两个.....
- linux 分区 文件,Linux的分区与文件结构
- 【转】SVN各种颜色状态
- 访问网络共享时出现“拒绝访问”
- 【MOSS】快速调试Sharepoint站点
- oracle 游标 904,如何解决Oracle数据库游标连接超出问题
- 少年自学python笔记_自学python 笔记
- golang 包含 数组_Golang数组类型
- 设计模式(五)行为型模式