一.转义符 "\""
正则中的转义:
1. '\(' :表示匹配小括号
2.[ () + * ? / $ .]: 在字符组中的一些特殊的字符会出现原形 注意:除了'^'
3.所有的 \w \d \s(\n,\t, ) \W \D \S都表示它原本的意义
4.[-]只有写在字符组的首位的时候表示普通的减号
写在其他的位置是表示范围[1-9]
如果要匹配减号[1\-9]
python中的转义:
1.'\' 表示转义, '\n'表示给这个'n'赋予了特殊意义
2.print('\\n') 结果为:\n 此时的\表示取消转义
3.python中 r'\\n'表示取消转义
二.re模块
1.findall , search, match
findall: 会优先显示()中的内容,要想取消分组优先,(?:正则表达式)
#findall的用法
import re ret = re.findall('\d+','19874ashfk01248') #参数 返回值类型:列表 返回值个数:1 返回值内容:所有匹配上的项 print(ret) ret1 = re.findall('\s+','19874ashfk01248') #没有匹配到,返回空列表 print(ret1) 结果: ['19874', '01248'] []
优先显示():
ret = re.findall('www.baidu.com|www.oldboy.com','www.oldboy.com')
print(ret)
ret = re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret)
ret = re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret)
结果:
['www.oldboy.com']
['oldboy']
['www.oldboy.com']
search : 如果search中有分组的话,通过group(n)就能够拿到group中的匹配的内容
import re ret2 = re.search('\d+','@$19874ashfk01248') print(ret2)# 返回值类型: 正则匹配结果的对象 返回值个数:1 如果匹配上了就返回对象 if ret2: print(ret2.group()) # 返回的对象通过group来获取匹配到的第一个结果 结果: <_sre.SRE_Match object; span=(2, 7), match='19874'> 19874 ret3 = re.search('\s+','19874ashfk01248') print(ret3) # 返回值类型: None 如果没有匹配上就是None 分组遇见search: ret = re.search('\d+(.\d+)(.\d+)(.\d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))') print(ret.group()) print(ret.group(0))# 0表示空和上面一样 print(ret.group(1)) print(ret.group(2)) print(ret.group(3))
match : 同search用法一样,不过仅在字符串开始处匹配
import re ret4 = re.match('\d+','19874ashfk01248') print(ret4.group()) ret5 = re.match('\d+','%^19874ashfk01248') print(ret5) 结果: 19874 None
2.sub , subn , split
sub: 同replace一样,可以设置替换的次数
import re ret = re.sub('\d+','H','replace789nbc2xcz392zx') print(ret) ret1 = re.sub('\d+','H','replace789nbc2xcz392zx,48495',1) print(ret1) 结果: replaceHnbcHxczHzx replaceHnbc2xcz392zx,48495
subn: 返回一个元祖,并返回替换了多少次
import re ret = re.subn('\d+','H','replace789nbc2xcz392zx') print(ret) 结果: ('replaceHnbcHxczHzx', 3)
split: 匹配部分加()可以保留匹配项
import re ret = re.split('\d+','alex83egon20taibai40') print(ret) ret = re.split('(\d+)','alex83egon20taibai40') print(ret) 结果: ['alex', 'egon', 'taibai', ''] ['alex', '83', 'egon', '20', 'taibai', '40', '']
3. compile finditer
complie: 编译,将正则表达式编译成为一个 正则表达式对象
节省时间 : 只有在多次使用某一个相同的正则表达式的时候,这个compile才会帮助我们提高程序的效率
import re ret = re.compile('-0\.\d+|-[1-9]\d+(\.\d+)?') res = ret.search('alex83egon-20taibai-40') print(res.group()) 结果: -20
finditer: 节省空间
import re ret = re.finditer('\d','sjkhkdy982ufejwsh02yu93jfpwcmc') for r in ret: print(r.group()) 结果: 9 8 2 0 2 9 3
三.分组命名
(?P<name>正则表达式) :给分组起名字
(?P=name) 表示使用这个分组,这里匹配到的内容应该和分
import re ret = re.search("<(?P<name>\w+)>\w+</(?P=name)>","<h1>hello</h1>") print(ret.group('name')) #结果 :h1 print(ret.group()) #结果 :<h1>hello</h1> ret = re.search(r'<(?P<tag>\w+)>(?P<c>\w+)</(\w+)>',r'<a>wahaha</b>') print(ret.group()) print(ret.group('tag')) print(ret.group('c')) 结果: h1 <h1>hello</h1>
通过索引使用分组:
\1 表示使用第一组,匹配到的内容必须和第一个组中的内容完全相同
import re ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>") '\1'指的是第一组,也就是h1 print(ret.group(1)) print(ret.group()) #结果 : h1 <h1>hello</h1>