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的现象
- 为什么要用分组?
把想要的内容放分组里 - 如何取消分组优先
如果在写正则的时候由于不得已的原因 导致不要的内容也得写在分组里
(?😃 取消这个分组的优先显示,就是分组但不显示
(csdn这里有bug,冒号在这里显示为表情)
ret = re.search('<(?:\w+)>(\w+)</\w+>','<h1>askh930s02391j192agsj</h1>')
print(ret.group(1))# askh930s02391j192agsj
- 为什么在search中不需要分组优先显示,而在findall中需要?
你想要的东西单纯的正则表达式拿不到,你想要的进行分组就显示了,从而筛选真正需要的数据
在search中,进行分组,可以想拿那个分组就拿那个分组,findall做不到
小范围正则不能获取全部就扩大正则匹配的范围
re其他方法
sblit 切割
根据正则切割字符串,使用分组可以保留切割的内容
- 根据正则进行切割
import re
jieGuo=re.split('\d+','abc123def')
print(jieGuo)# ['abc', 'def']
- 使用分组保留切割
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中,许多数字与字母都是有特殊意义的