# re模块,各个模块的比较

re模块,各个模块的比较

1.match()

match必须从头匹配一个对象,只匹配一个,成功返回一个对象,没有成功返回None
match基本和search一样,不一样的是search是全局的匹配一个合规则的字串
为什么要有分组?
提取匹配成功的部分我们需要的内容,先全部匹配,然后将我们需要的局部提取出来

match.group() 得到匹配成功的所有结果
match.groups() 得到模型中匹配成功的分组结果
match.groupdict() 只提取定义了key的分组结果

#!/usr/bin/env python #这个是标记了解释器在哪,就可以直接执行
# -*- coding:utf8 -*-
import re
#无分组
origin = "hello alex bcd alex lge alex acd 19"
# 有两个分组定义了key
# 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
r = re.match("(?P<n1>h)(?P<n2>\w+)", origin)   #?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
print(r.group())     # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups())    # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict()) # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
#输出结果
# hello                         匹配到的全部拿出来
# ('h', 'ello')                 有分组,在匹配到的字符串中拿出分组的部分
# {'n1': 'h', 'n2': 'ello'}     有定义了key的组所以,将定义了key的组里的内容以字典形式拿出来

2.search()

浏览整个字符串去匹配第一个,而且只匹配一个,就是第一个,匹配成功返回对象,否则返回None

r = re.search("a(?P<n1>\w+).*(?P<n2>\d)", origin)   #?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
print(r.group())     # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups())    # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict()) # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
#输出结果
# alex bcd alex lge alex acd 19                         匹配到的全部拿出来
# ('lex', '9')                 有分组,在匹配到的字符串中拿出分组的部分
# {'n1': 'lex', 'n2': '9'}     有定义了key的组所以,将定义了key的组里的内容以字典形式拿出来

3.最常用的findall()

浏览字符串匹配所有合乎规则的字符串,成功返回一个列表,未成功返回一个空列表,而且注意一点,匹配成功的字符串,不再参与下次的匹配,例子说明

#!/usr/bin/env python
# -*- coding:utf8 -*-
import re
#无分组
r = re.findall("\d+\w\d+", "a2b3c4d5")    #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
print(r)
#输出结果
#['2b3', '4d5']
#注意:匹配成功的字符串,不在参与下次匹配,所以3c4也符合规则但是没匹配到

如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表

r = re.findall("", "a2b3c4d5")    #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
print(r)
#输出结果
#['', '', '', '', '', '', '', '', '']

注意:正则匹配到空字符的情况,如果规则里只有一个组,而组后面是就表示组里的内容可以是0个或者多过,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白)所以尽量避免用*否则会有可能匹配出空字符串

注意:正则只拿组里最后一位,如果规则里只有一个组,匹配到的字符串里在拿组内容是,拿的是匹配到的内容最后一位

origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("(a)*", origin)   
print(r)
#输出结果 ['', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', 'a', '', '', '', '', 'a', '', '', '', '', '', '']

如果没有分组,匹配所有合乎规则的结果放入列表;
有分组,只放入分组里的结果进列表;
多个分组:只将匹配到的字符串里,组的部分放到一个元组中,最后将所有元组放到一个列表里返;
分组中有分组:只将匹配到的字符串里,组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回

origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("a\w+", origin)    #浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
print(r)
#输出结果
#['alex', 'alex', 'alex', 'acd']

origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("a(\w+)", origin)    #有分组:只将匹配到的字符串里,组的部分放到列表里返回
print(r)
#输出结果
#['lex', 'lex', 'lex', 'cd']

r = re.findall("(a)(\w+)", origin)    #多个分组:只将匹配到的字符串里,组的部分放到一个元组中,最后将所有元组放到一个列表里返回
print(r)
#输出结果
#[('a', 'lex'), ('a', 'lex'), ('a', 'lex'), ('a', 'cd')]

r = re.findall("(a)(\w+(e))", origin)    #分组中有分组:只将匹配到的字符串里,组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回
print(r)
#输出结果
#[('a', 'le', 'e'), ('a', 'le', 'e'), ('a', 'le', 'e')]

? 在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()

b = re.findall("a(?:\w+)",origin) #?:在有分组的情况下,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()
print(b)
#输出
# ['alex', 'alex', 'alex', 'acd']

4.split() 返回分割后的列表

根据正则分割,类似字符串的split
split(pattern, string, maxsplit=0, flags=0)

pattern: 正则模型 string : 要匹配的字符串 maxsplit:指定分割个数 flags : 匹配模式
根据一个字符串将所有分割

origin = "hello alex bcd alex lge alex acd 19"
r = re.split("a", origin) #根据正则匹配分割字符串
print(r)
#输出结果 ['hello ', 'lex bcd ', 'lex lge ', 'lex ', 'cd 19']

根据匹配到的字符串作为分割标准

	origin = "hello alex bcd alex lge alex 2acd 19"
	r = re.split("a\w+", origin) #根据正则匹配分割字符串
	print(r)
	#输出结果 ['hello ', ' bcd ', ' lge ', ' 2', ' 19']
	#将匹配到的字符串作为分割标准进行分割

5.sub替换匹配成功后的字符串

sub(pattern, repl, string, count=0, flags=0)

pattern: 正则模型
repl : 要替换的字符串
string : 要匹配的字符串
count : 指定匹配个数
flags : 匹配模式

origin = "hello alex bcd alex lge alex acd 19"
r = re.sub("a","替换",origin) #替换匹配成功的指定位置字符串
print(r)
#输出
# hello 替换lex bcd 替换lex lge 替换lex 替换cd 19

猜你喜欢

转载自blog.csdn.net/JessePinkmen/article/details/83217089