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]))

溜了溜了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值