re模块
一 re模块的基础方法:
1.findall查找 :匹配所有 每一项都是列表中的一个元素
findall(正则表达式,待匹配的字符串,flag)
1 ret=re.findall('\d+',"sjshhdh123nd33") 2 3 结果:['123' '33'] 4 5 6 7 ret=re.findall('\d',"sjshdh123nd33") 8 9 10 结果:['1','2','3','3','3']
2 search查找:只匹配从左到右的第一个,得到的不是直接结果(而是迭代器),而是一个变量,通过这个变量的group方法来获取结果.如果没有匹配到,会返回None,使用group会报错
1 ret=re.search('\d+',"jkhk172按实际花费928") 2 print(ret) 结果的到一个内存地址,这是一个正则匹配的结果 3 得到:<_sre.SRE_Match object; span=(5, 8), match='172'> 4 5 print(ret.group()) 6 7 得到:172 (得到从左到右的第一个数字)
1 ret=re.search('\d+',"kkhhddhjfj") 待查找的字符串中没有数字,结果会报错 2 print(ret.grounp()) 3 4 结果:报错
1 ret=re.search('\d+','jkhk172按实际花费928') 2 if ret: 3 print(ret.grounp()) 4 5 6 7 结果:172
3 match查找:从头开始匹配,相当于search中的正则表达式加上一个^
1 ret=re.match('\d+$',"172sjkhk按实际花费928'") '\d+$' 从头开始匹配,到s时不是数字了,结果是None 2 print(ret) 3 4 5 结果:None 6 7 8 9 10 ret=re.match('\d+$',"172928'") 11 print(ret) 12 13 结果:<_sre.SRE_Match object; span=(0, 6), match='172928'> 14 15 print(ret.grounp) 16 17 结果:172928
二 字符串处理的方法
1 split(切割)
1 # s = 'alex83taibai40egon25' 2 ret=re.split('\d+',s) 3 print(ret) 4 5 6 结果:['alex', 'taibai', 'egon', '']
2 sub替换与subn替换
1 ret=re.sub('\d+','H',"alex83taibai40egon25") 用'H'来替换字符串中的数字 2 print(ret) 3 4 结果:alexHtaibaiHegonH 5 6 7 8 ret =re.sub('\d+','H',"alex83taibai40egon25",1)用'H'来替换字符串中的数字替换1次 9 print(ret) 10 11 结果:alexHtaibai40egon25 (83被替换掉) 12 13 14 15 16 ret=re.subn('\d+','H',"alex83taibai40egon25") 返回一个元组 17 print(ret) 18 19 结果:(alexHtaibaiHegonH,3) 返回结果的第个元素是被替换的次数
sub 与subn的区别:
subn返回的结果 有被替换次数的显示,而sub只是返回结果
三 re模块的进阶:时间/空间
1 compile :节省你使用正则表达式解决问题的时间,编译正则表达式编译成字节码,在多次使用的过程中,不会多次编译.
1 import re 2 ret=compile('\d+') 3 print(ret) 结果:re.compile('\\d+') 4 res=ret.findall('alex83taibai40egon25') 使用findall查找全部数字 5 print(res) 结果:['83', '40', '25'] 6 7 8 9 res = ret.search('sjkhk172按实际花费928') 找到从左到右的第一个数字172 10 print(res.group()) 11 12 13 结果:172
2 finditer 节省你使用正则表达式解决问题的空间/内存
1 import re 2 ret=re.finditer('\d+','alex83taibai40egon25') 3 for i in ret: 4 print(i.grounp()) 5 6 7 结果: 8 83 9 40 10 25
compile 编译一个正则表达式,用这个结果去search match findall finditer 能够节省时间
finditer 返回一个迭代器,所有非结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存
3 分组在re模块中的使用
1 import re 2 s = '<a>wahaha</a>' 3 ret=re.search('<\w+)(\w+)</(\w+)>',s) 4 print(ret.group()) 显示所有的结果 5 6 结果:<a>wahaha</a> 7 8 9 print(ret.group(1)) 数字参数代表的是取对应分组中的内容,取第一个分组中的内容 10 11 结果:a 12 13 print(ret.group(2)) 14 15 结果:wahaha 16 17 18 print(ret.group(3)) 19 20 结果:a
1 import re 2 s = '<a>wahaha</a>' 3 ret=re.findall('(\w+)',s) 4 print(ret) 5 6 结果:['a', 'wahaha', 'a'] 7 8 ret=re.findall('>(\w+)<',s) 9 print(ret) 10 11 12 结果:wahaha
1 import re 2 ret=re.findall('\d+\.\d+')?','1.234*4') 3 print(ret) 4 5 结果:['.234', '']
1 ret=re.split('\d+','alex83taibai40egon25') 2 print(ret) 3 4 5 结果:['alex', 'taibai', 'egon', 'aa'] 6 7 8 9 ret=re.split('(\d+)','alex83taibai40egon25') 有分组 10 print(ret) 11 12 结果:['alex', '83', 'taibai', '40', 'egon', '25', 'aa']
4 分组命名(?P<组名>正则表达式)
1 s = '<a>wahaha</a>' 2 ret=re.search('>(?P<vvv>\w+)<',s) 3 print(ret.group(1)) 4 print(ret.group('vvv')) 可以通过组名来获取数据 5 6 结果:wahaha 7 wahaha
1 s = '<a>wahaha</a>' 2 m='<(\w+)>(\w+)<(\w+)>' 3 ret=re.search(pattern.s) 4 print(ret.group(1)==ret.group(3)) 5 6 结果:True 7 8 9 10 pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>' 也可以用分组名来判断 11 ret = re.search(pattern,s) 12 print(ret) 13 14 15 结果:<_sre.SRE_Match object; span=(0, 13), match='<a>wahaha</a>'>