正则模块的应用

---恢复内容开始---

findall()用法

import re
s = "olxdboy67laonxa34nhaialex"
ret = re.findall("\d+",s)
print(ret)  #['67', '34']

search()   从左至右查询第一个就返回

s = "olxdboy67laonxa34nhaialex"
ret = re.search("\d+",s)
print(ret)   #<re.Match object; span=(7, 9), match='67'
print(ret.group())  #97  如果没有正则匹配的则会返回None,调用group会报错

match()  自带尖叫号,只匹配开始,相当于search加尖叫号

s = "olxdboy67laonxa34nhaialex"
ret = re.match("\d+",s)
print(ret)  #None

s = "87olxdboyaonxa34nhaialex"
ret = re.match("\d+",s)
print(ret) #<re.Match object; span=(0, 2), match='87'>
print(ret.group()) 87
 

split()

import re
s = "asdsghjasdhjkiusyedjsjkskis"
# ret = re.split("s",s)
# print(ret)  #['a', 'd', 'ghja', 'dhjkiu', 'yedj', 'jk', 'ki', '']
ret = re.split("s",s,3)  #后面的第是哪个参数代表切割几次
print(ret)  #['a', 'd', 'ghja', 'dhjkiusyedjsjkskis']

sub()

import re
s = "asdsghjasdhassyedjsjkaskis"
ret = re.sub("a","67",s,1) #第四个参数表示替换次数  注意第二个参数换成数字要加引号
print(ret)  #67sdsghjasdhjkiusyedjsjkskis
ret = re.sub("a","67",s)  #有第四个参数默认全部替换
print(ret)  #67sdsghj67sdh67ssyedjsjk67skis
ret= re.subn("a","67",s)
print(ret) #('67sdsghj67sdh67ssyedjsjk67skis', 4)
subn得到的是元祖,第二项是替换词次数

compile()  省时间

import re
s = "asdsghjasdhassyedjsjkaskis"
ret = re.compile("a")   #将  正则表达式进行编译,成为正则表达式对象
res = ret.search(s)  #用编译好的正则表达式
# print(res)  #<re.Match object; span=(0, 1), match='a'>
# print(res.group())#a

finder()   省空间

import re
s = "asdsghjasadhassyaedjasjakaskis"
ret = re.finditer("a",s)
print(ret)  #<callable_iterator object at 0x002AFDD0> 迭代器
for i in ret:
    print(i)#<re.Match object; span=(0, 1), match='a'>  后面的没有写玩还有几条
    print(i.group())  #a

compile()与finder()连用省空间和时间

import re
s = "asdsghjasdhassyedjsjkaskis"
ret = re.compile("a")   #将  正则表达式进行编译
print(ret)
res = ret.finditer(s)
print(res)  #<callable_iterator object at 0x002AFDD0>
for i in res:
    print(i)#<re.Match object; span=(0, 1), match='a'>  后面的没有写玩还有几条
    print(i.group())  #a

findall()的优先级查询

s = "baidioldbouyuiyuijio"
ret = re.findall("bai(di)o",s)
print(ret)   #['di'],只显示这正则表达式内部的是因为,findall的正则表达式的括号内部默认优先显示
#可以去掉加   ?:
ret= re.findall("bai(?:di)o",s)
print(ret)#['baidio']

 spllit()的优先级查询

ret=re.split("\d+","eva3egon4yuan")
print(ret) #结果 : ['eva', 'egon', 'yuan']

ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']

#在匹配部分加上()之后所切出的结果是不同的,
#没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的。

分组命名  ?p  

(?P<这个组的名字>正则表达式)
import re
s = '<a>wahaha</a>'
ret = re.search('>(?P<con>\w+)<',s)
print(ret.group(0))
print(ret.group(1))
print(ret.group('con'))

findall 和 split  得到的都是列表

search,match  finditer  都是的到的特殊一句话,要和group连用

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/lxx7/p/9494919.html