re模块(python中的正则)
re模块
在python要想使用正则必须借助于模块 re就是其中之一
基本操作方法
re.findall('正则表达式','带匹配的文本')
根据正则匹配除所有符合条件的数据
res = re.findall('b','eva jason jackson') print(res) # ['a', 'a', 'a'] 结果是一个列表(要么有元素 要么空列表)
re.search('正则表达式','带匹配的文本')
根据正则匹配到一个符合条件的就结束
.group(index\reg_name)
res = re.search('a','eva jason jackson') print(res) # 结果对象 print(res.group()) # 正在的结果 if res: print(res.group()) else: print('不好意思 没有找到') """如果没有符合条件的数据 那么search返回None 并且使用group会直接报错"""
re.match('正则表达式','带匹配的文本')
根据正则从头开始匹配(文本内容必须在开头匹配上)
.group(index\reg_name)
res = re.match('a','abac') # 根据正则从头开始匹配(文本内容必须在开头匹配上) print(res) print(res.group()) if res: print(res.group()) else: print('不好意思 没有找到') """如果没有符合条件的数据 那么match返回None 并且使用group会直接报错"""
re.split()
先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
# 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 res = re.split('[ab]','abcd') print(res) # ['', '', 'cd']
re.sub()
# 类似于字符串类型的replace方法 res = re.sub('\d','H','eva3jason4yuan4',1) # 替换正则匹配到的内容 res = re.sub('\d','H','eva3jason4yuan4') # 不写默认替换所有 print(res) # evaHjason4yuan4
re.subn()
"""返回元组 并提示替换了几处""" res = re.subn('\d','H','eva3jason4yuan4',1) print(res) # ('evaHjason4yuan4', 1) res = re.subn('\d','H','eva3jason4yuan4') print(res) # ('evaHjasonHyuanH', 3)
re.compile()
提前定义好正则后续可以反复使用
"""常用""" regexp_obj = re.compile('\d+') res = regexp_obj.search('absd213j1hjj213jk') # (待匹配的文本) res1 = regexp_obj.match('123hhkj2h1j3123') # (待匹配的文本) res2 = regexp_obj.findall('1213k1j2jhj21j3123hh') # (待匹配的文本) print(res,res1,res2)
re.finditer(正则表达式,待匹配的文本)
结果是一个迭代器
"""常用""" res = re.finditer('\d+','ashdklah21h23kj12jk3klj112312121kl131') print([i.group() for i in res])
无名分组与有名分组
无名分组其实就是对某一块正则表达式加括号
(\d+)
有名分组就是在加括号前提之上再给组命名
(?P<name>\d+)
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()默认是分组优先展示 取消分组优先
(?:\d+)
(?:?P<name>\d+)
'''常用''' # findall针对分组优先展示 无名分组 res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023') print(res) # ['023'] # 取消分组优先展示 无名分组 res1 = re.findall("^[1-9](?:\d{14})(?:\d{2}[0-9x])?$",'110105199812067023') print(res1)
?P<ooo> (re.search) # 有名分组
# 有名分组 res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023') print(res) print(res.group()) # 110105199812067023 print(res.group(1)) # 10105199812067 无名分组的取值方式(索引取) print(res.group('xxx')) # 10105199812067 print(res.group('ooo')) # 023
import re # 读取带匹配的数据 with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read() # 利用正则匹配数据 # 分公司名称 title_list = re.findall('<h2>(.*?)</h2>', data) print(title_list) # 分公司地址 address_list = re.findall("<p class='mapIco'>(.*?)</p>", data) print(address_list) # 分公司邮箱 email_list = re.findall("<p class='mailIco'>(.*?)</p>", data) print(email_list) # 分公司电话 phone_list = re.findall("<p class='telIco'>(.*?)</p>", data) res = zip(title_list, address_list, email_list, phone_list) for data_tuple in res: print(""" 公司名称:%s 公司地址:%s 公司邮箱:%s 公司电话:%s """ % (data_tuple[0], data_tuple[1], data_tuple[2], data_tuple[3]))
END