详解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 相关文章推荐
wxPython窗口中文乱码解决方法
Oct 11 Python
Python中IPYTHON入门实例
May 11 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
python实现排序算法解析
Sep 08 Python
详解python中init方法和随机数方法
Mar 13 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
python对常见数据类型的遍历解析
Aug 27 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
Pytorch 使用 nii数据做输入数据的操作
May 26 Python
基于python的opencv图像处理实现对斑马线的检测示例
Nov 29 Python
pandas按条件筛选数据的实现
Feb 20 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[04:28]2014DOTA2国际邀请赛 采访小兔子LGD挺进钥匙体育馆
2014/07/14 DOTA
Python压缩和解压缩zip文件
2015/02/14 Python
Python 专题三 字符串的基础知识
2017/03/19 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
幼儿园六一活动总结
2014/08/27 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
大学生年度个人总结
2015/02/15 职场文书
优秀团员个人总结
2015/02/26 职场文书
社区义诊通知
2015/04/24 职场文书
工作收入证明范本
2015/06/12 职场文书
七年级作文之秋游
2019/10/21 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
Python import模块的缓存问题解决方案
2021/06/02 Python
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL