超详细讲解python正则表达式_第1页
超详细讲解python正则表达式_第2页
超详细讲解python正则表达式_第3页
超详细讲解python正则表达式_第4页
超详细讲解python正则表达式_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第超详细讲解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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论