【知识点】
1、转义符:\
在python中,从正则表达到打印\n:r '\\n' r '\n'
\( ——表示匹配小括号 [ ( )+*?/$. ]——在字符组中一些特殊字符会现原形
2、re 模块
(1)字符串(匹配)
① findall(★★★★★)
1 import re 2 3 ret=re.findall('\d','snfe2462rcn453') 4 print(ret) # ['2', '4', '6', '2', '4', '5', '3'] 5 # 参数:先写正则表达,在写字符串 6 # 返回值类型:列表 7 # 返回值个数:1个 8 # 返回值内容:所有匹配上的项
② search(★★★★★)
1 import re 2 3 ret2=re.search('\d+','snfe2462rcn453') 4 print(ret2) # <_sre.SRE_Match object; span=(4, 8), match='2462'> 5 print(type(ret2)) # <class '_sre.SRE_Match'> 6 print(ret2.group()) # 2462 7 8 ret3=re.search('\s+','snfe2462rcn453') 9 print(ret3) # None 10 11 # 参数:先写正则表达,在写字符串 12 # 返回值类型:正则匹配结果的对象 13 # 返回值个数:1个 如果匹配上了就返回对象,没有就返回None 14 # 返回值内容:返回的对象通过group()来获取匹配到的第一个结果
③ match(★★):只从头开始匹配。(可以通过search实现,在search正则表达式前加^)
1 import re 2 3 ret4=re.match('\d+','123snfe2462rcn453') 4 print(ret4) # <_sre.SRE_Match object; span=(0, 3), match='123'> 5 ret5=re.match('\d+','snfe2462rcn453') 6 print(ret5) # None
(2)替换——replace
① sub(★★★)
1 import re 2 3 ret1=re.sub('\d','H','replace1234') 4 print(ret1) # replaceHHHH 5 6 ret2=re.sub('\d','H','replace1234',2) 7 print(ret2) # replaceHH34 8 9 ret3=re.sub('\d+','H','replace1234gerrwrc456') 10 print(ret3) # replaceHgerrwrcH 11 12 ret4=re.sub('\d+','H','replace1234gerrwrc456',1) 13 print(ret4) # replaceHgerrwrc456
② subn
1 import re 2 3 ret1=re.subn('\d+','H','replace1234dfseg234') 4 print(ret1) # ('replaceHdfsegH', 2) 返回元组,并显示替换的次数
(3)切割
① split(★★★)
1 import re 2 3 ret1=re.split('\d+','alex83egon20taibai40') 4 print(ret1) # ['alex', 'egon', 'taibai', '']
(4)进阶方法——爬虫\自动化开发
① compile(★★★★★):预编译
1 import re 2 3 ret1=re.compile('-0\.\d+|-[1-9]\d+(\.\d+)?') # 预编译 4 ret2=ret1.search('rfnc-20n rrn-40eb') 5 print(ret2.group()) # -20 6 # 节省优点:只有在多次使用某一个人相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率
② finditer(★★★★★):空效率
1 import re 2 3 ret=re.finditer('\d','jsgerk455fjkn2255vyv445') 4 for r in ret: 5 print(r.group()) # 迭代出拿到的每一个数字
3、正则表达式和python的re模块
(1)python中的正则表达式的两个坑
① findall——会优先显示分组中匹配的内容,要想取消分组优先显示:(?:正则表达式)
1 import re 2 3 ret=re.findall('www.baidu.com|www.oldboy.com','www.oldboy.com') 4 print(ret) # ['www.oldboy.com'] 5 6 ret1=re.findall('www.(baidu|oldboy).com','www.oldboy.com') 7 print(ret1) # ['oldboy'] (优先显示) 8 9 ret2=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com') 10 print(ret2) # ['www.oldboy.com'] (取消分组优先显示) 11 12 # 举例: 13 ret3=re.findall('-0\.\d+|-[1-9]\d*(\.\d+)?','-1ffsdcsv-200') 14 print(ret3) # ['', ''] 因为-1与-200均以被前面的匹配,而分组的没有匹配上,就出现了空 15 16 ret4=re.findall('-0\.\d+|-[1-9]\d*(?:\.\d+)?','-1ffsdcsv-200') 17 print(ret4) # ['-1', '-200'] 取消了分组优先显示
② split——遇到分组,会保留分组内被切掉的内容在列表中
1 import re 2 3 ret1=re.split('(\d+)','alex83egon20taibai40') 4 print(ret1) # ['alex', '83', 'egon', '20', 'taibai', '40', '']
(2)分组遇见search——如果search中有分组的话,通过group(n)就能够拿到group中匹配的内容
1 import re 2 3 ret=re.search('\d+(\.\d+)(\.\d+)(\.\d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))') 4 print(ret.group()) # 1.2.3.4 5 print(ret.group(1)) # .2 6 print(ret.group(2)) # .3 7 print(ret.group(3)) # .4
分组练习:
1 # 举例: 2 import re 3 4 ret=re.findall(r'\d+(?:\.\d+)|(\d+)','1-2*(60+(-40.35/5)-(-1*3))') 5 ret.remove('') 6 print(ret) # ['1', '2', '60', '5', '1', '3']
1 # 举例2: 2 ret1=re.search('<(\w+)>(\w+)</(\w+)>','<a>wahaha</a>') 3 print(ret1) 4 print(ret1.group(1)) # a 5 print(ret1.group(2)) # wahaha 6 print(ret1.group(3)) # a
(3)分组命名(进阶)
就上述例2,<a>wahaha</a>前后都是a,这就涉及到了分组命名了。
①(?P<name>正则表达式)表示给分组起名字,
(?P=name)表示使用这个分组,这里匹配都的内容应该和分组中的内容完全相同。
② 通过索引使用分组
\1 表示使用第一组,匹配到的内容必须和第一个组中的内容完全一致
1 import re 2 3 # 写法一 ?P<name> ?P=name 4 ret1=re.search('<(?P<name>\w+)>\w+</(?P=name)>','<a>wahaha</a>') 5 print(ret1.group()) # <a>wahaha</a> 6 print(ret1.group('name')) # a 通过名字获取 7 8 # 写法二 采用索引\1 9 ret1=re.search(r'<(\w+)>\w+</(\1)>','<a>wahaha</a>') 10 print(ret1.group()) # <a>wahaha</a>
(4)flags有多种可选值
re.I(IGNORECASE) 忽略大小写,括号内是完整的写法
re.M(MULTILINE) 多行模式,改变^和$的行为
re.S(DOTALL) 点可以匹配任意字符,包括换行符
【注】正则表达式的参考书:正则指引(python)
时间:2020-02-19 23:27:44