python之路----常用模块
Posted zmc940317
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之路----常用模块相关的知识,希望对你有一定的参考价值。
re 模块
import re (要使用模块,在开头写上)
注意:永远不要起一个py文件的名字,这个名字和你已知的模块同名!!!!!!!!
查找
.findall:匹配所有,每一项都是一个元素
语法:findall(正则表达式,要判断的字符串)
返回值是一个 列表
import re res = re.findall("d+","dshfd587sdsf982") #正则表达式,待匹配的字符串. print(res) ret = re.findall("d","dshfd587sdsf982") print(ret) 结果: [‘587‘, ‘982‘] [‘5‘, ‘8‘, ‘7‘, ‘9‘, ‘8‘, ‘2‘]
.search:只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法来得到结果,
如果没有匹配到,会返回None,使用group会报错.
语法:search(正则表达式,待匹配字符串)
直接返回是一个内存地址,通过group()返回的是真正的结果
import re ret = re.search("d+","dshfd587sdsf982") print(ret) #内存地址,正则匹配的结果 print(ret.group()) #通过ret.group()获取真正结果 ret = re.search(‘d+‘,‘sjkhk172按实际花费928‘) if ret : #内存地址,这是一个正则匹配的结果,如果匹配到,则走if print(ret.group()) #通过ret.group()来获取真正的结果 res = re.search("d","asdfgvcxzds") print(res) print(res.group()) 结果: <_sre.SRE_Match object; span=(5, 8), match=‘587‘> 587 172 None Traceback (most recent call last): File "E:/wanchengdezuoye/复习/复习.py", line 1482, in <module> print(res.group()) AttributeError: ‘NoneType‘ object has no attribute ‘group‘
.match:从头开始匹配,相当于search中的正则表达式加上一个 ^
语法:match(正则表达式,待匹配字符串)
返回的是一个内存地址,也是要用group()返回真正的值
import re ret = re.match(‘d+$‘,‘172sjkhk按实际花费928‘) print(ret) #match相当于search 加 ^ ,属于以xxx开头,加上 $ 后,属于以xxx开头,以xxx结尾. #而且 ^和$ 默认是整个字符串是否以xxx开头,结尾. 结果: None import re ret = re.match("d+$","196123456789928") print(ret.group()) 结果: 196123456789928
字符串处理的扩展:替换 切割
.split:切割
import re s = "asdf45fgh89sdcvf23" ret = re.split("d+",s) #以数字为切割符 print(ret) 结果: [‘asdf‘, ‘fgh‘, ‘sdcvf‘, ‘‘] import re s = "asdf45fgh89sdcvf23aaa" ret = re.split("d+",s) print(ret) 结果: [‘asdf‘, ‘fgh‘, ‘sdcvf‘, ‘aaa‘]
.sub:替换,(旧的,新的,要替换的字符串,次数)
import re s = "asd45zxc89wer910rrr" ret = re.sub("d+","A",s) #将字符串s中的数字换成A print(ret) 结果: asdAzxcAwerArrr import re s = "asd45zxc89wer910rrr" ret = re.sub("d+","A",s,1) #将字符串中的数字换成A,要替换的次数为1次 print(ret) 结果: asdAzxc89wer910rrr
.subn:返回一个元组,第二个元素师替换的次数
import re s = "asd45zxc89wer910rrr" ret = re.subn("d+","A",s) print(ret) 结果: (‘asdAzxcAwerArrr‘, 3)
re模块的进阶:时间/空间的节省
.compile:节省你使用正则表达式解决问题的时间
将正则表达式 编译成 字节码 ,在下面的多次使用中 不用多次编译了
语法:compile(正则表达式)
返回的是编译后的正则表达式的内存地址
import re s = re.compile("d+") #已经编译完了 print(s) ret = s.findall("asdf45fgh89sdcvf23aaa") print(ret) res = s.search("asdf45fgh89sdcvf23aaa") print(res.group()) 结果: re.compile(‘\d+‘) [‘45‘, ‘89‘, ‘23‘] 45
.finditer:节省你使用正则表达式解决问题的空间/内存
语法:finditer(正则表达式,待匹配字符串)
返回的是一个可迭代对象的内存地址,可以循环之后用group()得到真正的结果
s = re.finditer("d+","asd45zxc89wer910rrr") for i in s: print(i.group()) 结果: 45 89 910
*******分组在re模块中的使用:
格式:优先级对findall()使用,如果正则表达式中有分组, (? : 正则表达式) 取消优先级
分组对 search 序列标号提取要匹配的, 或者对该分组命名 格式 (? p <name>)
同时对HTML格式提取, "<(?P<count>w+)>(w+)</(?P=count)>" 前面和后面的判断必须一样
import re
s = ‘<a>wahaha</a>‘ # 标签语言 html 网页 ret = re.search(">(w*)<",s) #为了findall也可以顺利取到分组中的内容,有个特殊语法,也就是优先显示分组中的内容print(ret.group(1)) ret = re.findall(">(w*)<",s) # 优先级 print(ret) s1 = "515.64123165" ret2 = re.findall("d+(?:.d+)?",s1) # 取消优先级 print(ret2) 结果:
wahaha
[‘wahaha‘]
[‘515.64123165‘]
import re
s = "<a>wahaha</a>" #标签语言 html= re.search("<(w+)>(w+)</(w+)>",s) #可以根据分组的位置标号提取 print(ret1.group()) #所有的结果 print(ret1.group(1)) print(ret1.group(2)) print(ret1.group(3))
<a>wahaha</a>
a
wahaha
a
import re
s = ‘<a>wahaha</a>‘ ret1 = re.search("<(?P<con>w+)>(?P<con1>w+)</(?P<con2>w+)>",s) # 可以根据分组的名字提取 print(ret1.group()) print(ret1.group(‘con‘)) print(ret1.group(‘con1‘)) print(ret1.group(‘con2‘))
结果:
<a>wahaha</a>
a
wahaha
a
s = ‘<a>wahaha</a>‘ ret6 = re.search("<(?P<conu>w+)>(w+)</(?P=conu)>",s) #要求使用这个名字的分组和前面同名分组中的内容匹配必须一致 print(ret6.group())
结果:
<a>wahaha</a>
以上是关于python之路----常用模块的主要内容,如果未能解决你的问题,请参考以下文章