详解Python 最短匹配模式


Posted in Python onJuly 29, 2020

问题

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

解决方案

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

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

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

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

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

讨论

这一节展示了在写包含点(.)字符的正则表达式的时候遇到的一些常见问题。 在一个模式字符串中,点(.)匹配除了换行外的任何字符。 然而,如果你将点(.)号放在开始与结束符(比如引号)之间的时候,那么匹配操作会查找符合模式的最长可能匹配。 这样通常会导致很多中间的被开始与结束符包含的文本被忽略掉,并最终被包含在匹配结果字符串中返回。 通过在 * 或者 + 这样的操作符后面添加一个 ? 可以强制匹配算法改成寻找最短的可能匹配。

以上就是详解Python 最短匹配模式的详细内容,更多关于Python 最短匹配模式的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
举例详解Python中的split()函数的使用方法
Apr 07 Python
详解Python中的文件操作
Aug 28 Python
Python搜索引擎实现原理和方法
Nov 27 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
基于python3 OpenCV3实现静态图片人脸识别
May 25 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
python开头的coding设置方法
Aug 08 Python
ubuntu上安装python的实例方法
Sep 30 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
Python如何给你的程序做性能测试
Jul 29 #Python
Python3爬虫中关于中文分词的详解
Jul 29 #Python
Python3爬虫中pyspider的安装步骤
Jul 29 #Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 #Python
Python3爬虫mitmproxy的安装步骤
Jul 29 #Python
Python使用jpype模块调用jar包过程解析
Jul 29 #Python
Python 防止死锁的方法
Jul 29 #Python
You might like
php5.3 注意事项说明
2013/07/01 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
2017/11/11 Python
python实现推箱子游戏
2020/03/25 Python
tensorflow多维张量计算实例
2020/02/11 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
韩国11街:11STREET
2018/03/27 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
法人代表任命书范本
2014/06/05 职场文书
小学生成绩单评语
2014/12/31 职场文书
城管年度个人总结
2015/02/28 职场文书
小学生安全保证书
2015/05/09 职场文书
花田少年史观后感
2015/06/16 职场文书
小学数学国培研修日志
2015/11/13 职场文书
2016年禁毒宣传活动总结
2016/04/05 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL