re模块
![image]()
1、re模块需记方法(三)
# 1、findall方法
'''
findall方法:根据正则表达式筛选出所有符合条件的数据,返回结果是一个列表
如果没有符合条件的数据,返回一个空列表
re.findall('正则表达式', '待匹配的文本')
'''
import re
res = re.findall('\d+', '1sad21jad3j4kq1')
print(res) # ['1', '21', '3', '4', '1']
res1 = re.findall('c', 'birthday')
print(res1) # []
![image]()
# 2、search方法
'''
search方法:根据条件筛选出一个符合条件的数据,如果有则利用group方法返回相应的数据,
若没有符合条件的数据,search返回None,且group方法会报错
re.search('正则表达式','待匹配的文本')
'''
res = re.search('\d+', 'sad21jad3j4kq1')
print(res.group()) # 21
res1 = re.search('w', 'sad21jad3j4kq1')
print(res1) # None
print(res1.group()) # 报错
# 解决办法:
if res1:
print(res1.group())
else:
print('未找到') # 未找到
![image]()
# 3、match方法
'''
match方法和search方法返回值的方式类似,都是利用group方法,
match方法是根据筛选条件从头开始匹配(文本内容必须在开头匹配上),
找到了即返回,找不到利用group方法就会报错
re.match('正则表达式','待匹配的字符')
'''
res = re.match('\d+','1sad21')
# print(res.group()) # 1
res1 = re.match('\d+','sad21')
print(res1) # None
print(res1.group()) # 报错
# 解决办法
if res1:
print(res1.group())
else:
print('未找到')
![image]()
2、常见的其他方法
# 1、split方法
'''
split方法按照正则表达式对字符串进行切割,切割后的元素以列表的形式返回
re.split('正则表达式','待分割的字符')
'''
import re
# 先按'a'分割得到''和'bcd',再对''和'bcd'按照'b'分割
res = re.split('[ab]','abcd')
print(res) # ['', '', 'cd']
![image]()
# sub方法
'''
sub方法按照正则表达式,先匹配字符,再把匹配到的字符用指定字符进行替换,同时可以指定替换的次数,
类似于字符串中replace方法
re.sub('正则表达式','指定字符',’待匹配的字‘,'替换的次数'),替换次数默认替换所有
'''
res = re.sub('\d', 'W', '2ADAs23ada1dasd1')
print(res) # WADAsadaWdasdW
# subn方法
'''
subn方法和sub方法一样,都是替换指定字符,只不过,subn方法会把替换后的结果和替换的次数
组成元组的形式返回
'''
res = re.subn('\d', 'W', '2ADAs23ada1dasd1')
print(res) # ('WADAsWWadaWdasdW', 5)
![image]()
# 常用方法之compile
regexp_obj = re.compile('\d+') # 编译正则表达式模式
res = regexp_obj.findall('2ADAs23ada1dasd1')
print(res) # ['2', '23', '1', '1']
# 常用方法之finditer
'''
使用finditer方法生成一个迭代器
'''
res = re.finditer('\d+','2ADAs23ada1dasd1')
print([i.group() for i in res]) # ['2', '23', '1', '1']
![image]()
# 无名分组
'''
无名分组根据分组对应的索引取值
'''
# 无名分组(search)
res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
print(res)
print(res.group()) # 110105199812067023
print(res.group(1)) # 10105199812067
print(res.group(2)) # 023
# findall针对分组优先展示 无名分组
'''
当使用findall方法匹配字符串时,若正则表达式中含有分组的情况,
会优先展示分组里的值
'''
res = re.findall("^[1-9](\d{14})(\d{2}[0-9x])?$",'110105199812067023')
print(res) # [('10105199812067', '023')]
# 取消分组优先展示 无名分组
'''
取消分组优先展示的方式:
在分组表达式里开头加上'?:'
'''
res = re.findall("^[1-9]\d{14}(?:\d{2}[0-9x])?$",'110105199812067023')
print(res) # ['110105199812067023']
![image]()
# 有名分组
'''
我们在使用search方法时展示分组的数据时,是根据分组所对应的索引值取的,
这种方法又叫无名分组
其实也有一种有名分组,就是在每个分组的开头前面加上'?P<组名>'
'''
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023')
print(res.group(1)) # 10105199812067
print(res.group(2)) # 023
print(res.group('xxx')) # 10105199812067
print(res.group('ooo')) # 023
![image]()