python模块之re模块
目录
- python模块之re模块
- 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\d{14})(?P\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('(.*?)
', data)
# print(title_list)
# 分公司地址
address_list = re.findall("(.*?)
", data)
# print(address_list)
# 分公司邮箱
email_list = re.findall("(.*?)
", data)
# print(email_list)
# 分公司电话
phone_list = re.findall("(.*?)
", 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]))