python内置模块之re模块,实战radmu
目录
取消转义
在正则表达式中取消转义推荐使用\ # 每个只\能取消一个字符的转义
但是,在python中取消转义直接使用 r'\n\a\t' 即可
python内置模块之re模块
re.findall
import re
re.findall('正则表达式', '带匹配的文本') # 根据正则表达式匹配出符合条件的数据
'''生成结果为列表'''
import re
res = re.findall('ji', 'jiji123ji123j')
print(res)
# ['ji', 'ji', 'ji']
或者单个字符
res = re.findall('j', 'jiji123ji123jjjjjjjj')
print(res)
# ['j', 'j', 'j', 'j', 'j', 'j', 'j', 'j', 'j', 'j', 'j']
或者正则表达式
res = re.findall('\d', 'jiji123ji123jjjjjjjj')
print(res)
# ['1', '2', '3', '1', '2', '3']
'''结果是一个列表(要么有元素 要么空列表)'''
re.search
res = re.search('正则表达式', '带匹配的文本') # 根据正则匹配到 一个 符合条件的就结束
res = re.search('\d', 'jiji123ji123jjjjjjjj')
print(res.group())
# 1
或者
res = re.search('j', 'jiji123ji123jjjjjjjj')
print(res.group())
# j
但是,正则表达式若不在文本中
res = re.search('4', 'jiji123ji123jjjjjjjj')
print(res)
print(res.group())
# print(res):None print(res.group()):报错
'''
如果没有符合条件的数据 那么search返回None (print(res))
并且使用group会直接报错
'''
出现正则表达式若不在文本中情况如何避免报错?
if res:
print('re.group()')
else:
print('不好意思,没有找到')
re.match
res = re.search('正则表达式', '带匹配的文本')
# 根据正则从头开始匹配(文本内容必须在开头匹配上)
res = re.match('a', 'abacad')
res = re.match('b', 'abacad')
print(res)
# print(res.group())
# 判断 实现报错提示
if res:
print(res.group())
else:
print('不好意思')
'''如果没有符合条件的数据 那么match返回None 并且使用group会直接报错'''
re模块其他方法
re.split
import re
# 先按'a'分割得到''和'ccccccb',再对'ccccccb'分别按'b'分割
res = re.split('[ab]', 'aaaaaccccccb')
print(res)
# ['', '', '', '', '', 'cccccc', '']
re.sub和re.subn
# 类似字符串的replace方法
import re
res = re.sub('\d','h','junjiejiji123123') # 不写默认替换所有
print(res)
# junjiejijihhhhhh
res = re.sub('\d','h','junjiejiji123123',1) # 替换正则匹配到的内容,从做往右顺序
# junjiejijih23123
import re
res = re.subn('\d','h','junjiejiji123123',1) # 元组形式返回,提示替换了几处
print(res)
# ('junjiejijih23123', 1)
re.compile
obj = re.compile('\d') # 将正则表达式赋值
user = 'junjiejunjie123123'
res = obj.search(user)
print(res.group())
# 1
'''常用'''
re.finditer
# 将对象转为可迭代对象
res = re.finditer('\d', 'junjiejunjie123123junjie123')
res1 = res.__next__()
print(res1.group())
# 1
或者
import re
res = re.finditer('\d', 'junjiejunjie123123junjie123')
print([i.group() for i in res])
# ['1', '2', '3', '1', '2', '3', '1', '2', '3']
'''常用'''
无名分组(以上所述均为无名分组)
res = re.search('^[1-9]\d{14}(\d{2}[0-9x])?$','110105199812067023')
print(res)
# <_sre.SRE_Match object; span=(0, 18), match='110105199812067023'>
print(res.group())
# 110105199812067023
import re
res = re.search('^[1-9]\d{14}(\d{2}[0-9x])?$','110105199812067023')
print(res.group(1))
# 023 \ (\d{2}[0-9x]) 括号分组
或者
res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
print(res.group(1))
# 10105199812067 \ (\d{14}) 括号分组改变了序列
print(res.group(2))
# 023
针对 re.findall (分组会优先展示)
res = re.findall("^[1-9]\d{14}(\d{2}[0-9x])?$",'110105199812067023')
print(res)
# ['023']
如何在re.findall 中取消分组优先展示?
res = re.findall("^[1-9]\d{14}(?:\d{2}[0-9x])?$",'110105199812067023')
print(res)
# ['110105199812067023']
# 在分组中添加 (?: ...)
有名 分组
如何给表达式起别名?
import re
res = re.search('^[1-9](?P<xxx>\d{14})(?P<junjie>\d{2}[0-9x])?$','110105199812067023')
print(res.group()) # 110105199812067023
print(res.group(1)) # 索引取值
print(res.group('xxx')) # 10105199812067
print(res.group('junjie')) # 023
# 先分组,在分组的开头添加(?P<名字>)
正则实战
import re
# 读取待匹配数据
with open(r'radmu.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)
# 邮编
zip_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(zip_list)
# 电话
phone_list = re.findall("<p class='telIco'>(.*?)</p></li><li", data)
# print(phone_list)
res = zip(title_list,address_list,zip_list,phone_list)
# print(list(res))
for data_tuple in res:
print("""
公司名称:%s
公司地址:%s
公司邮编:%s
公司电话:%s
""" % (data_tuple[0], data_tuple[1], data_tuple[2], data_tuple[3]))
溜了溜了