详解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中查看变量内存地址的方法
May 05 Python
Python中查看文件名和文件路径
Mar 31 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
python2.7和NLTK安装详细教程
Sep 19 Python
APIStar:一个专为Python3设计的API框架
Sep 26 Python
numpy中的ndarray方法和属性详解
May 27 Python
Python 字符串类型列表转换成真正列表类型过程解析
Aug 26 Python
python 使用while写猜年龄小游戏过程解析
Oct 07 Python
Python API len函数操作过程解析
Mar 05 Python
使用python实现飞机大战游戏
Mar 23 Python
python对批量WAV音频进行等长分割的方法实现
Sep 25 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
php 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
Prototype Function对象 学习
2009/07/12 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
13 个JavaScript 性能提升技巧分享
2012/07/26 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python调用C++程序的方法详解
2017/01/24 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
python+matplotlib演示电偶极子实例代码
2018/01/12 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python 高效编程技巧分享
2020/09/10 Python
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
现代化办公人员工作的自我评价
2013/10/16 职场文书
《再见了,亲人》教学反思
2014/02/26 职场文书
考博专家推荐信
2014/05/10 职场文书
汽车车尾标语大全
2015/08/11 职场文书
员工给公司的建议书
2019/06/24 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电