python re.match()用法相关示例


Posted in Python onJanuary 27, 2021

学习python爬虫时遇到了一个问题,书上有示例如下:

import re

line='Cats are smarter than dogs'
matchObj=re.match(r'(.*)are(.*?).*',line)

if matchObj:
 print('matchObj.group():',matchObj.group())
 print('matchObj.group(1):', matchObj.group(1))
 print('matchObj.group(2):', matchObj.group(2))
else:
 print('No match!\n')

书上的期望输出是:

matchObj.group(): Cats are smarter than dogs
matchObj.group(1): Cats
matchObj.group(2):smarter

但是我在电脑上跑了一遍得到的输出却是:

matchObj.group(): Cats are smarter than dogs
matchObj.group(1): Cats
matchObj.group(2):

于是开始想办法彻底搞清楚这个差别的原因所在。

首先要读懂这几行代码,而这一行代码的关键在于这一句:

matchObj=re.match(r'(.*)are(.*?).*',line)

匹配的正则表达式是

(.*)are(.*?).*
前面的r表示的是匹配的字符不进行转义,而要匹配的字符串是line,也就是
Cats are smarter than dogs
后面使用group(num),个人理解是,按照正则表达式中的括号数可以捕获得到对应数量的捕获组,而调用group(num)就可以得到对应捕获组的内容,
其中group(0)表示的是匹配的整个表达式的字符串,在本例中就是‘Cats are smarter than dogs'。
参照网上可以搜到的符号的作用:
.匹配除换行符以外的任意字符
*重复之前的字符零次或更多次
?重复之前的字符零次或一次
那么第一个括号的内容,应当就是匹配要匹配的字符串中are之前的所有字符(除换行符),
而第二个括号的内容应当是匹配are之后的内容,但具体想指代什么却显得有些不明确。
不明确的点就在于*和?这两个符号的连用,根据优先级这两个符号是同一优先级的,那么应当按照顺序生效,那么如此翻译的话,这一语句匹配的就是长度为0到无限大的任意字符串,为了探清此时
程序判断的具体内容,我们给匹配字符串末尾的.*也加上括号以提取其内容,而后在输出部分加上对应语句:

import re

line='Cats are smarter than dogs'
matchObj=re.match(r'(.*)are(.*?)(.*)',line)

if matchObj:
 print("matchObj.group():",matchObj.group())
 print("matchObj.group(1):", matchObj.group(1))
 print("matchObj.group(2):", matchObj.group(2))
 print("matchObj.group(3):", matchObj.group(3))
else:
 print('No match!\n')

得到的结果是:

matchObj.group(): Cats are smarter than dogs
matchObj.group(1): Cats
matchObj.group(2):
matchObj.group(3):  smarter than dogs

可见第二个括号里的内容被默认为空了,然后删去那个?,可以看到结果变成:

matchObj.group(): Cats are smarter than dogs
matchObj.group(1): Cats
matchObj.group(2):  smarter than dogs
matchObj.group(3):

那么这是否就意味着?的默认值很可能是0次,那?这个符号到底有什么用呢

仔细想来这个说法并不是很严谨。尝试使用单独的.?组合可以看到这个组合可以用于提取

单个不知道是否存在的字符,而如下代码

import re

line='Cats are smarter than dogs'
matchObj=re.match(r'(.*) are(.*)?',line)

if matchObj:
 print("matchObj.group():",matchObj.group())
 print("matchObj.group(1):", matchObj.group(1))
 print("matchObj.group(2):", matchObj.group(2))

也能在组别2中正常提取到are之后的字符内容,但稍微改动一下将?放到第二个括号内,

就什么也提取不到,同时导致group(0)中匹配的字符到Cats are就截止了(也就是第二个括号匹配失败)。

令人感到奇怪的是,如果将上面的代码改成

import re

line='Cats are smarter than dogs'
matchObj=re.match(r'(.*) are (.*)+',line)

if matchObj:
 print("matchObj.group():",matchObj.group())
 print("matchObj.group(1):", matchObj.group(1))
 print("matchObj.group(2):", matchObj.group(2))

也就是仅仅将?改为+,虽然能成功匹配整个line但group(2)中没有内容,

如果把+放到第二个括号中就会产生报错,匹配失败。

那么是否可以认为.*?这三个符号连用只是一个不规范的操作,但由于?的特殊性所以没有报错反而匹配成功了呢?

具体的可能要研究代码本身的机理了,暂且搁置。还有一个问题就是如何达到样例本身想要的,用第二个括号提取单个单词的目的。

如果单单考虑这个例子的话,把原本第二个括号中的?换成r就可以了,也就是如下代码:

import re

line='Cats are smarter than dogs'
matchObj=re.match(r'(.*) are (.*r).*',line)

if matchObj:
 print("matchObj.group():",matchObj.group())
 print("matchObj.group(1):", matchObj.group(1))
 print("matchObj.group(2):", matchObj.group(2))
 #print("matchObj.group(3):", matchObj.group(3))
else:
 print('No match!\n')

为了泛用性尝试了一下把r改成‘ '但是得到的结果是‘smarter than '。于是尝试把.换成表示任意字母的

[a-zA-Z],成功提取出了单个smarter,代码如下:

import re

line='Cats are smarter than dogs'
matchObj=re.match(r'(.*) are ([a-zA-Z]* ).*',line)

if matchObj:
 print("matchObj.group():",matchObj.group())
 print("matchObj.group(1):", matchObj.group(1))
 print("matchObj.group(2):", matchObj.group(2))
 #print("matchObj.group(3):", matchObj.group(3))
else:
 print('No match!\n')

到此这篇关于python re.match()用法相关示例的文章就介绍到这了,更多相关python re.match()内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python基于动态规划算法计算单词距离
Jul 25 Python
python相似模块用例
Mar 04 Python
Python编写电话薄实现增删改查功能
May 07 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Python中list的交、并、差集获取方法示例
Aug 01 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
利用python实现.dcm格式图像转为.jpg格式
Jan 13 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
Python configparser模块操作代码实例
Jun 08 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 Python
selenium+python实现基本自动化测试的示例代码
Jan 27 #Python
Python开发.exe小工具的详细步骤
Jan 27 #Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 #Python
python正则表达式re.match()匹配多个字符方法的实现
Jan 27 #Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 #Python
详解appium自动化测试工具(monitor、uiautomatorviewer)
Jan 27 #Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 #Python
You might like
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
2015/09/17 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
2018/05/15 NodeJs
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
python实现中文文本分句的例子
2019/07/15 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
介绍一下常见的木马种类
2014/11/15 面试题
大学生就业自荐信
2013/10/26 职场文书
《掌声》教学反思
2014/02/23 职场文书
承诺书样本
2014/08/30 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
武侯祠导游词
2015/02/04 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
初中重阳节活动总结
2015/05/05 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
python读取mat文件生成h5文件的实现
2022/07/15 Python