一、元字符
1、简介
后面跟元字符,去除元字符的特殊功能;跟普通字符,实现特殊功能;
d 数字 十进制;相当于[0-9]
D 非数字 相当于[^0-9]
w 数字或字母 相当于[Aa-z-Z0-9]
W 数字或字母 相当于[^Aa-z-Z0-9]
s 空格 相当于[ fv]
S 空格 相当于[^ fv]
匹配一个单词边界,也就是指单词和空格间的位置
- -
. 除换行符之外的任意字符
* 任意个字符 0到无穷
+ 至少一个 1到无穷
? 0个或1个
{} 设置几个
[] 里面的字符取一个
A|B A或B
^ 以什么开头.[^2]代表除2之外的值
$ 以什么结尾
2.注意事项
①数字 的作用 2的意思是,在2的位置是2组的内容。
y = re.search(r"(wang)(duo)(qiu)2", "wangduoqiuduo").group() print(y) #结果wangduoqiuduo
② 匹配一个单词边界,也就是指单词和空格(特殊字符)间的位置
b=re.findall(r"wang","qiuwang duo") print(b) b=re.findall(r"wang","qiu wangduo") print(b) #结果['wang'] ['wang']
③注意这种情况 如果后面有限定条件,那么?不起作用
f1=re.findall(r"a(d+)b","a23b") print(f1) f2=re.findall(r"(ad+?)","a23b") print(f2) #结果 ['23'] ['a2']
二、函数
1.简介
①.match 从头匹配
②.search 匹配第一个符合规则的字符串
③.findall 将匹配到的所有内容放在一个列表中
④.finditer
⑤.sub 替换
⑥.compile 编译某个方法
⑦.split
2.详细
①match: re.match(pattern,string,flags=0)
flag的参数:
re.I 使匹配对大小写不敏感
re.L 做本地化识别匹配
re.M 多行匹配,影响^和$
re.S 使"."匹配包括换行在内的所有字符
re.U
re.X
②search search(pattern, string, flags=0): 返回的是match对象,输出的时候加一个group才能输出
r=re.search(r"([0-9]*)([a-z]*)([0-9]*)","123abc456").groups() print(r) #结果('123', 'abc', '456')
match 和search匹配成功的话返回的都是一个match对象,下面写一下这个对象的功能
start() 返回匹配开始的位置
end() 返回匹配结束的位置
sapn() 返回一个元组,包含匹配开始和匹配结束的位置
group() 返回被re匹配的字符串
group(n,m)返回组号为n,m所匹配的字符串
groups() 获取匹配到的()中的所有结果,列为列表
groupdict() 在(?P<n1>h) 输出结果为{n1:h}
f=re.match(r"(?P<wangduo>q)(w+)yu","qiuyu wangduo qiuyu wangduo qicyu").groupdict() print(f) #结果{'wangduo': 'q'}
③findall findall(pattern, string, flags=0)
取得是组里面的内容;在括号前面加一个?:代表去掉优先捕获,即可以取得全部的内容;如果没有括号,那么就是跟match一样;findall捕获的是match中groups中的内容
#取得是组里面的内容
f=re.findall(r"q(w+)yu","qiuyu wangduo qiuyu wangduo qicyu") print(f) #结果['iu', 'iu', 'ic']
#在括号前面加一个?:代表去掉优先捕获
f=re.findall(r"q(w+)yu","qiuyu wangduo qiuyu wangduo qicyu") print(f) #结果['qiuyu', 'qiuyu', 'qicyu']
# 如果没有括号,那么就是跟match一样
f=re.findall(r"qw+yu","qiuyu wangduo qiuyu wangduo qicyu") print(f) #结果['qiuyu', 'qiuyu', 'qicyu']
# findall捕获的是match中groups中的内容.不能加?P<>字典,怎样搞呢,见finditer
f=re.findall(r"(q)(w+)yu","qiuyu wangduo qiuyu wangduo qicyu") print(f) #结果[('q', 'iu'), ('q', 'iu'), ('q', 'ic')]
# 括号中再加一个括号.只要有括号,就要提取。方向是从左到右,从外到内。
f=re.findall(r"(q)((w+)(u))(yu)","qiuyu wangduo qiuyu wangduo qicyu") print(f) #结果[('q', 'iu', 'i', 'u', 'yu'), ('q', 'iu', 'i', 'u', 'yu')]
# 比较下面两个
f=re.findall(r"asd*","asdasd") print(f) f=re.findall(r"(?:asd)*","asdasd") print(f) #结果['asd', 'asd'] ['asdasd', '']
④finditer
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
f3=re.finditer(r"(q)(?P<wang>w+)yu","qiuyu wangduo qiuyu wangduo qicyu") for i in f3: a=i.group() print(a) b=i.groups() print(b) c=i.groupdict() print(c) #结果 qiuyu ('q', 'iu') {'wang': 'iu'} qiuyu ('q', 'iu') {'wang': 'iu'} qicyu ('q', 'ic') {'wang': 'ic'}
⑤sub 替换 re.sub(pattern,repl,string,max=0) 2代表替换前两个
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
s=re.sub("g.t","have","i gut a,i get b,i gct c",2) print(s) s,t=re.subn("g.t","have","i gut a,i get b,i gct c",2) print(s,t) #结果 i have a,i have b,i gct c i have a,i have b,i gct c 2
⑥compile compile(pattern, flags=0拿3findall来举例子
find = re.compile(r"qw+yu") c = find.findall("qiuyu wangduo qiuyu wangduo qicyu") print(c) #结果['qiuyu', 'qiuyu', 'qicyu']
⑦spilt 分割(pattern, string, maxsplit=0(最多分割几次), flags=0)
# 无分组()的时候,输出无分割元素
s="wang duo qiuyu qiuyu wang" p=re.split("qw+",s,maxsplit=1) print(p) #结果['wang duo ', ' qiuyu wang']
# 有分组的时候,输出有分割元素
s="wang duo qiuyu qiuyu wang" p=re.split("(qw+)",s,maxsplit=1) print(p) #结果['wang duo ', 'qiuyu', ' qiuyu wang']
# 计算器去括号
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
origin="((6*6+3)+(123+(456+459)*545+486)+156)" def f1(x): """ 计算加减乘除 """ return 1 while True: print(origin) result = re.split(r"(([^()]+))",origin,1) if len(result)==3: # before=result[0] # center=result[1] # after=result[2] # 已经知道有三个元素,那么还可以这样写 before,center,after=result r=f1(center) origin=before+str(r)+after else: print(f1(origin)) break #结果: ((6*6+3)+(123+(456+459)*545+486)+156) (1+(123+(456+459)*545+486)+156) (1+(123+1*545+486)+156) (1+1+156) 1 1
3.杂货
# 杂货
# r'^d{3}-d{3,8}$ 加了r就不用考虑转义问题了。 以三个数字开头,-,以3-8个数字结尾
# 非贪婪模式,加一个?