版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第超详细讲解python正则表达式re.Matchobject;span=(0,1),match='8'
re.Matchobject;span=(0,0),match=''
re.Matchobject;span=(0,8),match='87654321'
re.Matchobject;span=(0,0),match=''
re.Matchobject;span=(0,8),match='87654321'
None
re.Matchobject;span=(0,8),match='87654321'
None
re.Matchobject;span=(0,8),match='87654321'
None
1.3.2贪婪量词和懒惰量词
量词还可以细分为贪婪量词和懒惰量词,贪婪量词会尽可能多地匹配字符,懒惰量词会尽可能少地匹配字符。大多数计算机语言的正则表达式量词默认是贪婪的,要想使用懒惰量词在量词后面加即可
示例代码如下:
importre
m=re.search(r'\d{5,8}','87654321')
print(m)
m=re.search(r'\d{5,8}','87654321')
print(m)
输出结果如下:
re.Matchobject;span=(0,8),match='87654321'
re.Matchobject;span=(0,5),match='87654'
上述代码使用了贪婪量词{5,8},输入字符串87654321是长度8位的数字字符串,尽可能多地匹配字符结果是87654321。代码使用懒惰量词{5,8},输入字符串87654321是长度8位的数字字符串,尽可能少的匹配字符结果是87654。
1.4分组
在此之前学习的量词只能重复显示一个字符,如果想让一个字符串作为整体使用量词,可将整个字符串放到一对小括号中,这就是分组(也称子表达式)
1.4.1分组的使用
对正则表达式进行分组不经可以对一个字符串整体使用量词,还可以在正则表达式中引用已经存在的分组。示例代码如下:
importre
p=r'(121){2}'
m=re.search(p,'121121abcabc')
print(m)
print(m.group())#返回匹配的字符串
print(m.group(1))#返回第一组内容
p=r'(\d{3,4})-(\d{7,8})'
m=re.search(p,)
print(m)
print(m.group())#返回匹配字符串
print(m.groups())#获得所有组内容
输出结果如下:
re.Matchobject;span=(0,6),match='121121'
121121
121
re.Matchobject;span=(0,12),match=
('010','87654321')
上述代码定义的正则表达式(121)是将121字符串分为一组,(121){2}表示对121重复两次,即121121。代码调用match对象的group()方法返回匹配的字符串,group()方法语法如下:
match.group([group1,...])
其中参数group1是组编号,在正则表达式中组编号是从1开始的,所以代码正则表达式m.group(1)表示返回第一组内容
代码r'(\d{3,4})-(\d{7,8})'正则表达式可以用来验证固定电话号码,在-之前是3-4位的区号,-之后是7-8位的电话号码。在该正则表达式中有两个分组。代码m.groups()方法是返回所有分组,返回值是一个元组
1.4.2分组命名
在Python程序中访问分组时,除了可以通过组编号进行访问,还可以通过组名进行访问,前提是要在正则表达式中为组命名。组命名通过在组开头添加P分组名实现。
示例代码如下:
importre
p=r'(Parea_code\d{3,4})-(Pphone_code\d{7,8})'
m=re.search(p,)
print(m)
print(m.group())#返回匹配字符串
print(m.groups())#获得所有组内容
#通过组编号返回组内容
print(m.group(1))
print(m.group(2))
#通过组名返回组内容
print(m.group('area_code'))
print(m.group('phone_code'))
输出结果如下:
re.Matchobject;span=(0,12),match=
('010','87654321')
010
87654321
010
87654321
上述代码其实和1.4.1的代码是一样的,只是给正则表达式命名了,以后就可以通过组编号或组名字来访问
1.4.3反向引用分组
除了可以在程序diamante中访问正则表达式匹配之后的分组内容,还可以再正则表达式内部引用之前的分组。
下面通过示例熟悉以下反向引用分组。假设由于工作需要想解析一段XML代码,需要找到某一个开始标签和结束标签,示例代码如下:
importre
p=r'([\w]+).*/([\w]+)'
m=re.search(p,'aabc/a')
print(m)
p=r'([\w]+).*/([\w]+)'
m=re.search(p,'aabc/b')
print(m)
输出结果如下:
re.Matchobject;span=(0,10),match='aabc/a'
re.Matchobject;span=(0,10),match='aabc/b'
上述代码的正则表达式分成了两组,两组内容完全一样。但是测试结果发现他们都是匹配的,但是aabc/b明显不是有效的XML代码,因为开始标签和结束标签应该是一致的。可见代码r'([\w]+).*/([\w]+)'并不能保证开始标签和结束标签是一致的。为了解决此问题,可以引用反向引用,即让第二组反向引用第一组。在正则表达式中反向引用语法是\组编号,组编号是从1开始的。示例代码如下:
importre
p=r'([\w]+).*/\1'#使用了反向引用①
m=re.search(p,'aabc/a')
print(m)#匹配
m=re.search(p,'aabc/b')
print(m)#不匹配
输出结果如下:
re.Matchobject;span=(0,10),match='aabc/a'
None
上述代码第①行时定义正则表达式,其中\1是反向引用第一个组,从运行结果可见字符串aabc/a是匹配的,而aabc/b字符串不匹配
1.4.4非捕获分组
前面介绍的分组称为捕获分组。捕获分组的匹配子表达式结果被暂时保存到内存中,以备表达式或其他程序引用,这个过程称为"捕获",捕获结果可以通过组编号或组名进行引用。但是有时并不想引用子表达式的匹配结果,不想捕获匹配结果,只是将小括号作为一个整体进行匹配,此时可以使用非捕获分组,在组开头使用,可以实现非捕获分组
示例代码如下:
importre
s='img1.jpg,img2.jpg,img3.bmp'
#捕获分组
p=r'\w+(\.jpg)'
mlist=re.findall(p,s)①
print(mlist)
#非捕获分组
p=r'\w+(:\.jpg)'
mlist=re.findall(p,s)②
print(mlist)
输出结果如下:
['.jpg','.jpg']
['img1.jpg','img2.jpg']
上述代码实现了从字符串中查找.jpg结尾的文本,其中代码第①行和第②行的正则表达式区别在于前者是捕获分组,后者是非捕获分组。捕获分组将括号中的内容作为子表达式进行捕获匹配,将匹配的子表达式(即组的内容)返回,结果是['.jpg','.jpg']。而非捕获分组将括号中的内容作为普通的正则表达式字符串进行整体匹配,即找到.jpg结尾的文本,所以最后结果是['img1.jpg','img2.jpg']。
1.5re模块
re是Python内置的正则表达式模块,前面虽然使用过re模块一些函数,但还有很多重要函数没有详细介绍,这一节将详细介绍这些函数
1.5.1search()和match()函数
search()和match()函数非常相似,它们的区别如下所示
search():在输入字符串中查找,返回第一个匹配内容,如果找到一个则match对象,如果没有找到返回Nonematch():在输入字符串开始处查找匹配内容,如果找到一个则match对象,如果没有找到返回None
示例代码如下:
importre
p=r'\w+@jiakecong\.com'
text="Tony'semailistony_guan111@"①
m=re.search(p,text)
print(m)
m=re.match(p,text)
print(m)
email='tony_guan111@'②
m=re.search(p,email)
print(m)
m=re.match(p,email)
print(m)
#match对象几个方法
print('match对象几个方法:')③
print(m.group())
print(m.start())
print(m.end())
print(m.span())
输出结果如下:
re.Matchobject;span=(17,43),match='tony_guan111@'
None
re.Matchobject;span=(0,26),match='tony_guan111@'
re.Matchobject;span=(0,26),match='tony_guan111@'
match对象几个方法:
tony_guan111@
0
26
(0,26)
上述代码第①行输入字符串开头不是email,search()函数可以匹配成功,而match()函数却匹配失败。代码第②行输入字符串开头就是email格式的邮箱,所以search()和match()函数都可以匹配成功
search和match()函数如果匹配成功都返回match对象。match对象有一些常用方法,见代码第③行。其中group()方法返回匹配的子字符串;start()方法返回子字符串的开始索引;end()方法返回子字符串的结束索引;span方法返回子字符串的跨度,它是一个二元素的元组。
1.5.2findall()和finditer()函数
findall()和finditer()函数非常相似,它们的区别如下所示
findall():在输入字符串中查找所有匹配内容,如果匹配成功,则返回match列表对象,如果匹配失败则返回None
finditer():在输入字符串中查找所有匹配内容,如果匹配成功,则返回容纳match的可迭代对象,通过迭代对象每次可以返回一个match对象,如果匹配失败则返回None
示例代码如下:
importre
p=r'[Jj]ava'
text='IlikeJavaandjava'
match_list=re.findall(p,text)①
print(match_list)
match_iter=re.finditer(p,text)②
forminmatch_iter:③
print(m.group())
输出结果如下:
['Java','java']
Java
java
上述代码第①行的findall()函数返回match列表对象。代码第②行的finditer()函数返回可迭代对象。代码第③行通过for循环遍历可迭代对象
1.5.3字符串分割
字符串分割使用split函数,该函数按照匹配的子字符串进行字符串分割,返回字符串列表对象
re.split(pattern,string,maxsplit=0,flags=0)
其中参数patte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 注册会计师战略中风险管理技术方法的应用选择
- 绿色中式风道德讲堂主题
- 生物科技公司实习心得体会
- 医疗器械信息咨询公司合同付款管理办法
- 麻纺厂物料消耗控制准则
- 2026广东省社会福利服务中心(广东江南医院)编外人员招聘26人备考题库及答案详解(名校卷)
- 2026四川 巴中市属国企市场化招聘聘职业经理人5人备考题库附参考答案详解(培优a卷)
- 2026南方科技大学生物医学工程系诚聘海内外高层次人才备考题库及答案详解(夺冠系列)
- 2026年上半年成都市温江区面向社会考核招聘副高级及以上职称教师备考题库(7人)含答案详解(夺分金卷)
- 2026山东菏泽宋江武校招聘备考题库及答案详解(基础+提升)
- 非遗泥塑传承与创新:传统色彩·现代技艺·实践探索【课件文档】
- 城管队伍建设考核制度
- 2026年高级经济师宏观经济学实务操作题集
- 护理礼仪与沟通:构建和谐医患关系
- 炎症性肠病精准医疗:生物标志物与治疗响应
- 酒店防偷拍安全制度规范
- 箱式变压器安装施工技术要求
- 2026年《必背60题》党校教师高频面试题包含详细解答
- TCEC低压用户供电可靠性评估导则2024
- 乳房包块护理查房
- 2025至2030中国碳纤维增强塑料(CFRP)复合材料行业产业运行态势及投资规划深度研究报告
评论
0/150
提交评论