day18
正则表达式用处?
匹配 字符串
1 s = 'hello world' 2 3 print(s.find('llo'))#第一个的位置 4 5 ret = s.replace('ll','xx') 6 print(ret) 7 8 print(s.split(' '))
执行结果
2 hexxo world ['hello', 'world'] Process finished with exit code 0
以上字符串提供的是完全匹配 模糊匹配,以上方法不可行,需正则表达式
1 import re 2 3 ret = re.findall('ww{2}l','hello world') # ['worl'] 4 print(ret) 5 6 ret1 = re.findall('alex', 'aalexsbvesalexfwfawea')#完全匹配,但是没必要 ['alex', 'alex'] 7 print(ret1) 8 print(' ') 9 #元字符 10 11 # . 代指所有符号,除换行符 通配符 . 12 reta = re.findall('w..l', r'hello w ld') #只能代指任意一个字符 ['w l'] 13 print(reta) 14 print(' ') 15 # ^ 16 retb = re.findall('^h...o', 'hjasdadsdhello') #只在开始匹配,尽管后面有hello [] 17 print(retb) 18 print(' ') 19 # $ 20 retc = re.findall('a..x$','asfsacsxjaoox') #只在最后匹配 ['aoox'] 21 print(retc) 22 print(' ') 23 # * 重复匹配 24 retd = re.findall('al.*i', 'sanvjalexli') #[0,+oo] 匹配0到多次 ['alexli'] 25 print(retd) 26 print(' ') 27 # + 重复匹配 28 rete = re.findall('ab+', 'sanvjah') #[1,+oo] 匹配1到多次,a后面必须接上b [] 29 print(rete) 30 print(' ') 31 # ? [0,1] 32 retf = re.findall('a?b', 'aaabhghabfb') #0个或者1个a,后面接b ['ab', 'ab', 'b'] 33 print(retf) 34 print(' ') 35 # {} 36 retg = re.findall('a{5}b', 'vaaaaaab') #5个a ['aaaaab'] 37 print(retg) 38 reth = re.findall('a{1,3}b', 'vaab') #贪婪匹配,设定一个范围,按最多的取 ['aab'] 39 print(reth)
执行结果
['worl'] ['alex', 'alex'] ['w l'] [] ['aoox'] ['alexli'] [] ['ab', 'ab', 'b'] ['aaaaab'] ['aab'] Process finished with exit code 0
结论:*等于{0,正无穷} +等于{1,正无穷} ?等于{0,1}
1 # 字符集 2 reta = re.findall('a[c,d]x', 'adx') # ['adx'] 3 print(reta) 4 5 retb = re.findall('[a-z]', 'adx') # a到z都可以匹配 ['a', 'd', 'x'] 6 print(retb)#['a', 'd', 'x'] 7 8 # [] 取消元字符的特殊功能, 但是 ^ - 例外 9 retc = re.findall('[w,*]', 'wad*') # *为一个普通字符 ['w', '*'] 10 print(retc) 11 12 #但是 ^ - 例外 13 retd = re.findall('[1-9,a-z,A-Z]', '12sfsA') # *为一个普通字符 ['1', '2', 's', 'f', 's', 'A'] 14 print(retd) 15 16 # ^放在[]中意味着去反 17 rete = re.findall('[^s,A]', '12sfsA') # 除了s和A ['1', '2', 'f'] 18 print(rete) 19 20 21 # 22 # 反斜杠后面跟元字符去除特殊功能 23 # 反斜杠后面跟普通字符实现特殊功能 24 25 print(re.findall('d{11}', 'scbdhsh3123124326543')) # d数字[0-9] ['31231243265'] 26 27 print(re.findall('sasd', 'fak asd')) # s匹配任何空白字符 [' asd'] 28 29 print(re.findall('w', 'scbhsh 12432'))# w字母数字 ,相当于a-zA-Z0-9 ['s', 'c', 'b', 'h', 's', 'h', '1', '2', '4', '3', '2'] 30 31 print(re.findall(r'I', 'hello, I am LI$T'))# 匹配一个特殊字符的边界 ['I', 'I'] 32 33 34 #匹配出第一个满足的结果 35 retf = re.search('sb', 'scbdsbhshsb')# 对象 36 print(retf) #<_sre.SRE_Match object; span=(4, 6), match='sb'> 37 print(retf.group()) 38 39 40 retg = re.search('a.g', 'a.gj').group()# 此时的点并不是通配符,只是一个 . a.g 41 print(retg)
执行结果:
['adx'] ['a', 'd', 'x'] ['w', '*'] ['1', '2', 's', 'f', 's', 'A'] ['1', '2', 'f'] ['31231243265'] [' asd'] ['s', 'c', 'b', 'h', 's', 'h', '1', '2', '4', '3', '2'] ['I', 'I'] <_sre.SRE_Match object; span=(4, 6), match='sb'> sb a.g Process finished with exit code 0
()
1 import re 2 ret = re.findall(r'\d', 'abcde')# r 代表原生字符串,将\d传给re,而非python解释器 3 print(ret) 4 5 m = re.search(r'blow', 'blow') 6 print(m) 7 8 print(re.search('(as)+', 'adcdasasas').group())#asas as为一个整体,匹配多个as 9 10 print(re.search('(as)|3', 'as3').group()) #或
执行结果
['\d'] <_sre.SRE_Match object; span=(0, 4), match='blow'> asasas as Process finished with exit code 0
1 import re
2 ret = re.findall("www.(w+).com", "www.baidu.com") #() 组的概念
3 print(ret)
执行结果:
['baidu']
Process finished with exit code 0
正则表达式的方法:
1.findall():所有结果都返回一个列表
2.search():返回匹配到的一个对象,对象可调用group()返回结果
3.match():只在字符串开始进行匹配
1 import re 2 eta = re.match('asd', 'fhdsasd')#只在字符串开始进行匹配 None 3 print(reta) 4 5 retb = re.split('[j,s]', 'sdjksal')# 注意空字符 ['', 'd', 'k', 'al'] 6 print(retb) 7 8 retc = re.sub('a..x', 's.....b', 'ffghalexbn') # 替换 ffghs.....bbn 9 print(retc) 10 11 retd = re.compile('.com')#规则被编译到对象, 点.不再是通配符 12 rete = retd.findall('adcdscd.com')#对象中已经有规则 13 print(rete)
执行结果:
None ['', 'd', 'k', 'al'] ffghs.....bbn ['.com'] Process finished with exit code 0
参考: