一.re模块
1.根据正则表达式查找内容
1.findall search match
import re ret=re.findall('d+','dakljwdi1564ssdnsh13') print(ret) #返回列表 检索出的内容是字符串格式 ret=re.search('d+','iuehfkajn1643s5ad435d14534s') print(ret) print(ret.group()) #返回显示结果集<_sre.SRE_Match object; span=(9, 13), match='1643'> #span(9,13)是索引值,match=‘1643’只能取到第一值 print(ret.group(0)) # print(ret.group(1)) #只取第一个值 所以会报错 #IndexError: no such group ret=re.search('d+','iuehfkajns') #这里检索内容无匹配项。返回时none,那么.group()就是报错 print(ret) # print(ret.group()) #AttributeError: 'NoneType' object has no attribute 'group' ret=re.match('d+','djsk123da') ret1=re.match('d+','123dasdsqdq123') #检索是是否已数字开头 print(ret) print(ret1) print(ret1.group(0)) #若有返回值,显示一个结果集,也要通过.group 取值
结果: ['1564', '13'] <_sre.SRE_Match object; span=(9, 13), match='1643'> 1643 1643 None None <_sre.SRE_Match object; span=(0, 3), match='123'> 123
match等价于search
import re ret = re.match('^d+', '12454sdd')#默认是以数字开头,^d+==d+ #ret = re.match('d+', '12454sdd') 等价于上面等式 ret1 = re.search('^d+', '12454sdd') #等价于上面等式 print(ret) print(ret1) #有返回值也是一个结果集,通过.group取值 #无返回值显示none
2.替换内容:
sub 与 subn
import re ret=re.sub('d+','男神','meets12wusir56') #替换数字为男神
ret1=re.sub('d+','男神','meets12wusir56',1) #后面跟着1 是count 计数替换位置
print(ret) print(ret1) 结果: meets男神wusir男神 <class 'str'> meets男神wusir56
subn用法与sub一样 只是返回值是元组形式。
ret=re.subn('d+','男神','meets12wusir56') ret1=re.subn('d+','男神','meets12wusir56',1) print(ret,type(ret)) print(ret1) 结果: ('meets男神wusir男神', 2) <class 'tuple'> ('meets男神wusir56', 1)
3.切割:
import re ret=re.split('d+','meet23wusir23') print(ret) #返回列表形式,切割按照数字 结果: ['meet', 'wusir', '']
4.对于重复使用的过程 我们为了节约时间,可以使用compile()
注意:1,时间 2,空间 3,用户体验
import re par=re.compile('d+') #先统一编译 ret=par.split('djsa554ds45ds') print(ret) ret1=par.search('dhjjsakh165ds4s5') print(ret1) print(ret1.group(0)) ret2=par.findall('jdklsajd544dsa5') print(ret2) 结果: ['djsa', 'ds', 'ds'] <_sre.SRE_Match object; span=(8, 11), match='165'> 165 ['544', '5']
5.为了空间,我们引入finditer
ret=re.finditer('d+','dksjak1234sda5'*200) for i in ret: print(i) print(i.group()) 结果: <_sre.SRE_Match object; span=(2792, 2796), match='1234'> 1234 <_sre.SRE_Match object; span=(2799, 2800), match='5'> 5
。
。
。
6.findall 永远优先显示分组内容。findall+()
import re ret=re.findall('>(w+)<',r'<title>15a4d3a45e< itle>')#优先显示分组内容 print(ret) #如何取消分组? ret=re.findall('>(?:w+)<',r'<title>15a4d3a45e< itle>') print(ret) 结果: ['15a4d3a45e'] ['>15a4d3a45e<']
优先分组需要注意:
import re ret = re.findall('www.(?:baidu|oldboy).com',r'www.baidu.com')#取消分组优先 ret1 = re.findall('www.(baidu|oldboy).com',r'www.baidu.com')#分组优先 print(ret) print(ret1) 结果: ['www.baidu.com'] ['baidu']
import re ret = re.findall('d+(?:.d+)?',r'1.23+2.34') ret1 = re.findall('d+(.d+)?',r'1.23+2.34') print(ret) print(ret1) 结果: ['1.23', '2.34'] ['.23', '.34']
7.spilt+()保留切割在分组的内容:
import re ret=re.split('(d+)','hjdsakd2564asd5sa4d5s4a6das') print(ret) 结果:
#显示了切割的内容 数字也返回去了 ['hjdsakd', '2564', 'asd', '5', 'sa', '4', 'd', '5', 's', '4', 'a', '6', 'das']
ret = re.split('d(d)','alex84wusir73') #优先显示第二个数字 print(ret) 结果: ['alex', '4', 'wusir', '3', '']
8.search+()
import re ret = re.search(r'<(w+)>(w+)<\(w+)>',r'<title>qqxing< itle>') print(ret.group()) # 不受到分组的影响 print(ret) # 不受到分组的影响,结果集 print(ret.group(1)) #对于括号的分组1 print(ret.group(2)) #对于括号的分组2 print(ret.group(3)) #对于括号的分组3 结果: <title>qqxing< itle> <_sre.SRE_Match object; span=(0, 21), match='<title>qqxing<\title>'> title qqxing title
再看看不加分组的区别:
import re ret = re.search(r'<w+>w+<\w+>',r'<title>qqxing< itle>') print(ret.group()) # 不受到分组的影响 print(ret) # 不受到分组的影响 print(ret.group(1)) #对于括号的分组1 print(ret.group(2)) #对于括号的分组2 print(ret.group(3)) #对于括号的分组3 #这里search只取第一个值 所以就没有分组 结果: <title>qqxing< itle> File "F:/pycharmproject/新建文件夹/day0322/demo.py", line 90, in <module> <_sre.SRE_Match object; span=(0, 21), match='<title>qqxing<\title>'> print(ret.group(1)) #对于括号的分组1 IndexError: no such group
这样就报错了!
9.分组命名:
import re ret = re.search(r'<(?P<tab1>w+)>(?P<content>w+)<\(w+)>',r'<title>qqxing< itle>') print(ret.group(0)) # 不受到分组的影响 print(ret.group('tab1')) # 不受到分组的影响 print(ret.group('content')) # 不受到分组的影响 结果: <title>qqxing< itle> title qqxing