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

 

 

 

 

 

posted @ 2021-11-25 17:39  Snails蜗牛  阅读(157)  评论(0编辑  收藏  举报