python模块之re模块

python模块之re模块

注意:记得调用re模块 如果出错可能你的文件名也为re

# 在python要想使用正则表达式必须借助于模块 
			#   re就是其中之一
    
import re
# re.findall
re.findall('正则表达式','待匹配的文本')   # 根据正则匹配出所有符合条件的数据
res = re.findall('b', 'kkjnnsdbadobasdbaqb')
print(res)   # ['b', 'b', 'b', 'b']  
# 找出待匹配的文本中所有的b并组合成一个列表(如果没有则为空列表)

# re.search
res = re.search('正则表达式', '待匹配的文本')  # 根据正则匹配到一个符号条件就结束
res = re.search('b', 'kkjnnsdbadobasdbaqb')
print(res)  # 打印出一个第一个b在字符串中的位置 找到一个b符号就结束
print(res.group())  # 打印出找到的b
######  如果没有符合条件的数据 search则返回None   使用group则报错
可以使用if判断解决该问题:
if res:
    print(res.group())
else:
    print('对不起无法找到')
 

# re.match
res = re.match('a', 'abac')   # 根据正则从头开始匹配(文本内容必须在开头匹配上)
print(res)
print(res.group())
######  同理:如果开头没有符合条件的数据 那么match返回None 使用group则报错
解决方案同样可以使用if判断:
if res:
    print(res.group())
else:
    print('对不起无法找到')

re模块其他用法

re.split()

re.split()

import re
line = 'aaa bbb ccc;ddd   eee,fff'
res = re.split(r';',line)
print(res)   #  输出为['aaa bbb ccc', 'ddd   eee,fff']

res = re.split('[ab]','abcd')
print(res)  # ['', '', 'cd']
# 先按'a' 分割得到''和'bdc'   在对''和'bcd'分别按'b'分割

re.sub()和re.subn()

re.sub()  # 相当于replace字符串替换

res = re.sub('\d','H','av3bv4cv5')  # 替换正则匹配到的内容  avHbvHcvH
res = re.sub('\d','H','av3bv4cv5',1)  # 末尾规定只替换一个  avHbv4cv5

re.subn()   # 返回元组 并提示替换了几处
res = re.sub('\d','H','av3bv4cv5')  # ('avHbv4cv5', 3)
res = re.sub('\d','H','av3bv4cv5',1)  # ('avHbv4cv5', 1)

re.complin()

content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
regex = re.compile('\w*o\w*')
x = regex.findall(content)
print(x)
['Hello', 'from', 'Chongqing', 'montain', 'to', 'you']

#可以看出返回的是一个匹配对象,它单独使用就没有任何意义,需要和findall(), search(),match()搭配使用。 

regexp_obj = re.compile('\d+')
res = regexp_obj.search('absd213j1hjj213jk')
res1 = regexp_obj.match('123hhkj2h1j3123')
res2 = regexp_obj.findall('1213k1j2jhj21j3123hh')
print(res)  # 213
print(res1)  # 123
print(res2)   # ['1213', '1', '2', '21', '3123']

re.finditer()

# 将带匹配对象转为迭代器对象
res = re.finditer('\d+','ashdklah21h23kj12jk3klj112312121kl131')
print([i.group() for i in res]) # 生成器表达式 

#  根据正则匹配字符组织成列表循环打印['21', '23', '12', '3', '112312121', '131']

无名分组与有名分组

#  正则表达式分组直接加括号就可以实现分析

res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
print(res)
print(res.group())  # 打印出正则匹配到的所有字符 :110105199812067023
print(res.group(1))  # 打印出(从左往右第一组)正则匹配的字符(\d{14}) : 10105199812067
print(res.group(2))  # 打印出(从左往右第二组)正则匹配的字符(\d{2}[0-9x])?$023

无名分组:
###   re.findall 针对分组是优先展示

res = re.findall('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
print(res)  # ['023']

####   在分组括号内最前添加?:可取消分组展示
res = re.findall('^[1-9](\d{14})(?:\d{2}[0-9x])?$','110105199812067023')
print(res)  # ['110105199812067023']

有名分组:
######   使用 ?P<命名>
res = re.search('^[1-9](?P<xxx>\d{14})(?P<ooo>\d{2}[0-9x])?$','110105199812067023')
print(res)
print(res.group)    
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]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值