python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析


Posted in Python onOctober 14, 2019

本文实例讲述了python 正则表达式贪婪模式与非贪婪模式原理、用法。分享给大家供大家参考,具体如下:

之前未接触过正则表达式,今日看python网络爬虫的源码,里面一行正则表达式匹配的代码初看之下,不是很理解,代码如下:

myItems = re.findall('<div.*?class="content".*?title="(.*?)">(.*?)</div>',unicodePage,re.S)

“.*?”这种匹配方式,按理解应该是匹配任意字符0个或多个(re.S模式,“.”可以匹配“\n”),但是这个“?”总觉的在这儿是多余的,既然不理解,就敲代码试试:

import re
patern = re.compile('www\..*')
match1 = patern.match("www.baidu.com")
if match1:
  print(match1.group())
else:
  print("match1 don't match")
#output
>>> ==================RESTART =============================
>>> 
www.baidu.com

这个结果,应该说是意料之中,加个“?”呢?

import re
patern = re.compile('www\..*?')
match1 = patern.match("www.baidu.com")
if match1:
  print(match1.group())
else:
  print("match1 don't match")
#output
>>> ==================RESTART =============================
>>> 
www.

竟然是这个结果。。。“.?”一个字符都没匹配,按“.”、“”、“?”的匹配理解,也就是“*”“?”均匹配前面字符0次,才会是这个结果,可是为啥就是0次了?

这就是正则表达式贪婪模式和非贪婪模式:

  • 贪婪模式,总是尝试匹配尽可能多的字符;
  • 非贪婪模式则相反,总是尝试匹配尽可能少的字符。

Python里数量词默认是贪婪的,这就解释了第一个匹配实验,输出结果为”www.baidu.com”(贪婪模式),也就是说第二个匹配实验是非贪婪模式,仅仅因为加了“?”,继续实验

import re
patern = re.compile('www\..?')
match1 = patern.match("www.baidu.com")
if match1:
  print(match1.group())
else:
  print("match1 don't match")
#output
>>> ==================RESTART =============================
>>> 
www.b

此次匹配结果,显然是贪婪模式。奇怪了,也就是“?”的特殊组合才是非贪婪模式。

网上搜索得如下说明:

标准量词修饰的子表达式,在可匹配可不匹配的情况下,总会先尝试进行匹配,称这种方式为匹配优先,或者贪婪模式。此前介绍的一些量词,“{m}”、“{m,n}”、“{m,}”、“?”、“*”和“+”都是匹配优先的。
一些NFA正则引擎支持忽略优先量词,也就是在标准量词后加一个“?”,此时,在可匹配可不匹配的情况下,总会先忽略匹配,只有在由忽略优先量词修饰的子表达式,必须进行匹配才能使整个表达式匹配成功时,才会进行匹配,称这种方式为忽略优先,或者非贪婪模式。忽略优先量词包括“{m}?”、“{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。

显然“*?”的组合是非贪婪模式,猜想正确,原来如此啊。

Python 相关文章推荐
python多进程操作实例
Nov 21 Python
详解supervisor使用教程
Nov 21 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
python获取代理IP的实例分享
May 07 Python
python实现自动网页截图并裁剪图片
Jul 30 Python
pytorch permute维度转换方法
Dec 14 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
Jan 23 Python
Tensorflow不支持AVX2指令集的解决方法
Feb 03 Python
Django框架获取form表单数据方式总结
Apr 22 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
Python 调用 ES、Solr、Phoenix的示例代码
Nov 23 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 #Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
Oct 14 #Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 #Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 #Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 #Python
解析Python3中的Import
Oct 13 #Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 #Python
You might like
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
PHP实现今天是星期几的几种写法
2013/09/26 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
js DOM的学习笔记
2011/12/22 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
jQuery中animate用法实例分析
2015/03/09 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
Vue 2.0 中依赖注入 provide/inject组合实战
2019/06/20 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python中三元表达式的几种写法介绍
2019/03/04 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
Python pip配置国内源的方法
2020/02/14 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
详解Python中的Lock和Rlock
2021/01/26 Python
深入浅出CSS3 background-clip,background-origin和border-image教程
2011/01/27 HTML / CSS
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
遇到的Mysql的面试题
2014/06/29 面试题
企业理念标语
2014/06/09 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
入党自传范文2015
2015/06/26 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
MySQL快速插入一亿测试数据
2021/06/23 MySQL