re模块02-re模块

re模块是内置模块

findall()方法

按照完整的正则进行匹配,有括号(分组)只是显示括号里匹配到的内容
匹配结果是以列表的形式返回所有正则匹配的内容

import re
jieGuo=re.findall('5\d\d','dfdfsd4584573485')
print(jieGuo) #['584', '573']

findall:取所有符合条件的,优先显示分组中的
有分组,按照正则表达式查找,但是只显示分组的内容

search()方法

按照完整的正则进行匹配,显示的是匹配到的第一个内容,但是我们可以通过给group方法传参数
来获取具体文组中的内容
结果是对象,通过group方法获取一个正则匹配的内容,匹配不到时对象结果返回None,此时group()取不到值就报错,可以通过异常处理设置

1、没有获取结果

import re
jieGuo=re.search('(\w)(\w)(\w)','!@#')
print(jieGuo) #None

2、获取到结果

ret = re.search('<(\w+)>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
print(ret.group())#默认参数0,显示全部
print(ret.group(1))
print(ret.group(2))

search 只取第一个符合条件的,没有优先显示这件事儿
得到的结果是一个变量
变量.group() 的结果 完全和 变量.group(0)的结果一致
变量.group(n) 的形式来指定获取第n个分组中匹配到的内容

如果我们要查找的内容在一个复杂的环境中
我们要查的内容并没有一个突出的 与众不同的特点 甚至会和不需要的杂乱的数据混合在一起
这个时候我们就需要把所有的数据都统计出来,然后对这个数据进行筛选,把我们真正需要的数据对应的正则表达式用()圈起来
这样我们就可以筛选出真正需要的数据了

现象

分组和findall的现象

  1. 为什么要用分组?
    把想要的内容放分组里
  2. 如何取消分组优先
    如果在写正则的时候由于不得已的原因 导致不要的内容也得写在分组里
    (?😃 取消这个分组的优先显示,就是分组但不显示
    (csdn这里有bug,冒号在这里显示为表情)
ret = re.search('<(?:\w+)>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
print(ret.group(1))# askh930s02391j192agsj
  1. 为什么在search中不需要分组优先显示,而在findall中需要?

你想要的东西单纯的正则表达式拿不到,你想要的进行分组就显示了,从而筛选真正需要的数据
在search中,进行分组,可以想拿那个分组就拿那个分组,findall做不到

小范围正则不能获取全部就扩大正则匹配的范围

re其他方法

sblit 切割

根据正则切割字符串,使用分组可以保留切割的内容

  1. 根据正则进行切割
import re
jieGuo=re.split('\d+','abc123def')
print(jieGuo)# ['abc', 'def']
  1. 使用分组保留切割
import re
jieGuo=re.split('(\d+)','abc123def')
print(jieGuo)# ['abc', '123', 'def']

sub 替换

使用正则匹配出来的内容替换为“替换的是数字”,匹配1次(次数不写默认替换全部

import re
jieGuo=re.sub('(\d+)','替换的是数字','abc123def123',1)
print(jieGuo)# abc替换的是数字def123

在这里插入图片描述

subn 替换

用法语sub一样,就是返回结果显示替换的次数
替换subn以及替换的次数,后面可以指定参数,一般不需要
返回结果显示替换的次数

import re
jieGuo=re.subn('(\d+)','替换的是数字','abc123def123')
print(jieGuo)# ('abc替换的是数字def替换的是数字', 2)

match 匹配以什么什么开头

相当于以……开始,一般用于用户输入验证
match,匹配以什么什么开头的,初次之外,跟search一样

import re
jieGuo=re.match('\d+','123abc123def123')
print(jieGuo.group())# 123

相当于

import re
jieGuo=re.search('^\d+','123abc123def123')
print(jieGuo.group())# 123

功能
性能
用户体验

  • 时间
    你要完成一个代码所需要执行的代码行数
    你在执行代码的过程中,底层程序是如何工作的
  • 空间
    是占用了宝贵的内存条资源
    影响程序的执行效率

compile 节省代码时间的工具

假如同一个正则表达式要被使用多次
节省了多次解析同一个正则表达式的时间,提升效率
如果没有重复使用同一个正则,也不能节省时间

import re
jieguo=re.compile('\d+')
jieGuo1=jieguo.search('abc123def123')
jieGuo2=jieguo.findall('abc123def123')

print(jieGuo1)# <re.Match object; span=(3, 6), match='123'>
print(jieGuo2)# ['123', '123']

finditer 节省空间

finditer则并不直接返回这些字符串,⽽是返回⼀个迭代器

import re

jieGuo=re.finditer('\d+','abc123def123')
for i in jieGuo:
    print(i.group())
print(i) # <re.Match object; span=(9, 12), match='123'>

在使用的时候先compile,在finditer

import re

jieGuo=re.compile('\d+')
jieGuo1=jieGuo.finditer('abc123def123')
for i in jieGuo1:
    print(i.group())

分组命名

你要哪个分组,就写在哪个分组里面
分组的名字不写引号,在调用输出的时候写
分组命名唯一

写法:(?P<名字>正则表达式)
调用:.group('名字')
import re

jieGuo=re.search('(\w)\w\w(?P<name1>\d+)(\w)\w\w(?P<name2>\d+)','abc123def456abc123def123')
print(jieGuo.group('name1')) #123 
print(jieGuo.group('name2')) #456

分组命名的引用

分组里面引用的是前面的内容,而且匹配的内容必须相同才行
引用的不是正则,是前面分组匹配的内容

import re

jieGuo=re.search('(\w)\w\w(?P<name>\d+)(\w)\w\w(?P=name)','abc123def123abc123def123')
print(jieGuo.group('name')) #123
分组命名(?P<组名>正则) (?P=组名)

分组索引

import re

jieGuo=re.search(r'\w\w\w(\d+)(\w)\w\w(\1)','abc123def123abc123def123')
print(jieGuo.group()) # abc123def123,这里的1表示第一组的内容,就是前面的分组

在python中有特殊意义,取消可以在字符串前面加上r,还有其他的也可以通过添加r解决
在python中,许多数字与字母都是有特殊意义的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅水鲤鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值