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抓取淘宝下拉框关键词的方法
Jul 08 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
python 中random模块的常用方法总结
Jul 08 Python
python入门前的第一课 python怎样入门
Mar 06 Python
python实现堆和索引堆的代码示例
Mar 19 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
Flask框架工厂函数用法实例分析
May 25 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
python pymysql库的常用操作
Oct 16 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
Django视图类型总结
Feb 17 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对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHPExcel简单读取excel文件示例
2016/05/26 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
php接口隔离原则实例分析
2019/11/11 PHP
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
(跨浏览器基础事件/浏览器检测/判断浏览器)经验代码分享
2013/01/24 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
vue中SPA单页面应用程序详解
2017/11/07 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
微信小程序button组件使用详解
2018/01/31 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
Vue实战教程之仿肯德基宅急送App
2019/07/19 Javascript
javascript实现鼠标点击生成文字特效
2019/12/24 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
pycharm远程调试openstack的图文教程
2017/11/21 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
Python pandas.DataFrame 找出有空值的行
2019/09/09 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
全球知名的婚恋交友网站:Match.com
2017/01/05 全球购物
共产党员批评与自我批评
2014/10/15 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL