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 str与repr的区别
Mar 23 Python
python双向链表实现实例代码
Nov 21 Python
python实现汉诺塔方法汇总
Jul 25 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
python实现多线程端口扫描
Aug 31 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
Python使用pdb调试代码的技巧
May 03 Python
Python基于Tkinter编写crc校验工具
May 06 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
Python调用OpenCV实现图像平滑代码实例
Jun 19 Python
selenium自动化测试入门实战
Dec 21 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
德劲1104的电路分析与改良
2021/03/01 无线电
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
Javascript的一种模块模式
2010/09/08 Javascript
JS高级笔记
2011/07/13 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
2018/03/01 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
JavaScript判断数组类型的方法
2019/10/23 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
Python自动发邮件脚本
2017/03/31 Python
3个用于数据科学的顶级Python库
2018/09/29 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
PyTorch的Optimizer训练工具的实现
2019/08/18 Python
Python龙贝格法求积分实例
2020/02/29 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
学生鉴定评语大全
2014/05/05 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
担保书范文
2015/01/20 职场文书
2015年话务员工作总结
2015/04/29 职场文书
开天辟地观后感
2015/06/09 职场文书
党员心得体会范文2016
2016/01/23 职场文书
Django rest framework如何自定义用户表
2021/06/09 Python