re模块进阶
re模块
三个常用的方法
findall
- 会匹配到字符串中的所有符合规则的项
- 并返回一个列表
- 如果未匹配到返回空列表
import re
ret = re.findall("\d","yang123")
print(ret)
#输出结果
#['1', '2', '3']
import re
ret = re.findall("\d+","yang123")
print(ret)
#输出结果
#['123']
search
- 会从头到尾匹配字符创中取出第一个符合条件的项
- 如果匹配到了,返回一个对象,用group取值
- 如果没匹配到,返回None,不能用group
import re
ret = re.search("\d+","yang123")
print(ret) #此处输出的是一个对象
print(ret.group())
#输出结果
#123
import re
ret = re.search("\d","yang123")
print(ret) #此处输出的是一个对象
print(ret.group())
#输出结果
#1
#会从头到尾匹配匹配字符串中取出第一个符合条件的项
import re
ret = re.search("^\d","yang123")
print(ret) #如果匹配上返回一个对象,如果不能匹配上返回NONE
print(ret.group())如果是None则报错
#输出结果
match
- 会从头开始匹配字符串中取出从第一个字符开始是否符合规则
- 如果符合,就返回对象,用group取值
- 如果不符合,就返回none
- match = serch + ^正则
ret = re.match("\d","1yang123")
print(ret)
#输出结果
#1
进阶方法
- 时间复杂度——效率——compile
- 在同一正则表达式重复使用多次的时候使用能够减少时间的开销
- 空间复杂度——内存占用率——finditer
- 在查询的结果超过1个的情况下,能够有效的节省内存,降低空间复杂度,从而也降低了时间的复杂度
- 用户体验
finditer
ret = re.findall("\d","1yang123"*200000000)
print(ret)#效率低,内存一下子干死
ret = re.finditer("\d","1yang123"*200000000) #迭代器
for i in ret: #迭代出来的每一项都是一个对象
print(i.group()) #通过group取值即可
compile
- 是一种编译方法,把正则表达式编译成python能理解的形式,节省重复的时间
- 在同一正则表达式重复使用多次的时候使用能够减少时间的开销
ret = re.compile("\d+")
print(ret)
r1 = ret.search("ynag123")
print(r1)
r2 = ret.findall("zi456")
print(r2)
r3 = ret.finditer("laing789")
print(r3)
#compile与finditer联用
import re
ret = re.compile("\d+")
r3 = ret.finder("taiban123")
for i in r3:
print(i.group())
#输出结果
#1
#2
#3
split
import re
ret = re.split("\d","abaiysa12kccgsud21s")#默认只保留分组当中的内容
print(ret)
#输出结果
#['abaiysa', '', 'kccgsud', '', 's']
#保留分组数字
import re
ret = re.split("(\d+)","abaiysa12kccgsud21s")
print(ret)
#输出结果为
#['abaiysa', '12', 'kccgsud', '21', 's']
sub、subn
import re
ret = re.sub("\d","D","agsiaig12kjd") #对其进行替换
print(ret)
#输出结果
#agsiaigDDkjd
ret = re.subn("\d","D","agsiaig12kjd")#可以显示结果和更换次数
print(ret)
#输出结果
#('agsiaigDDkjd', 2)
ret = re.subn("\d","D","agsiaig12kjd",1) #只更换第一处
print(ret)
#输出结果
#('agsiaigD2kjd', 1)
记录学习的点点滴滴