一、什么是正则表达式
1、正则表达式就是一个用来匹配和提取字符串的工具;
2、简单来说就是:在一堆东西里面提取我们想要的内容
3、正则表达式的模块是:re
4、re.findall():将符合规则的字符串以列表形式返回
import re
s = 'python123'
r1= re.findall('python``',s) #['python']
print(r1)
运行结果:['python']
二、元字符:. ^ $ {} * + ? | []
1、 . 通配符,(不能匹配像\n\r这样的转义符)
import re
s1 = 'python123'
s2 = 'python123\n'
r1 = re.findall('.', s1)
r2 = re.findall('.', s2)
#修饰符re.S(是单行匹配)可以使 . 匹配包括换行在内的所有字符
r3 = re.findall('.', s2, re.S)
print('r1',r1)
print('r2',r2)
print('r3',r3)
运行结果:r1 ['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3']
r2 ['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3']
r3 ['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3', '\n']
2、^ 脱字符 (从字符串开头进行匹配)
import re
s1 = 'python123\npython\n456\npython345'
print(s1)
r1 = re.findall('^python', s1) #只能匹配第一行的‘python’
r2 = re.findall('^python', s1, re.M) #re.M能执行多行匹配
print('r1',r1)
print('r2',r2)
运行结果:python123
python
456
python345
r1 ['python']
r2 ['python', 'python', 'python']
3、 $ 结束位置 (从字符串末尾进行匹配)
import re
s1 = 'python345\npython\n345\npython'
print(s1)
r1 = re.findall('python$', s1) #只能匹配到结尾最后一行’python‘
r2 = re.findall('345$', s1) #输出为[]
r3 = re.findall('python$', s1, re.M) #能匹配到多行的
r4 = re.findall('345$', s1, re.M) #可以匹配到与结尾行不同,是结尾行前的
print('r1',r1)
print('r2',r2)
print('r3',r3)
print('r4',r4)
运行结果:python345
python
345
python
r1 ['python']
r2 []
r3 ['python', 'python']
r4 ['345', '345']
4、 * + ? 匹配前面表达式分别为(0-n) (1-n) (0-1)
*允许出现0到无穷多次
+ 1到无穷多次
? 0到一次
import re
s1 = 'G\nGO\nGOOO'
print(s1)
r1 = re.findall('GO*', s1) #自行匹配所有行(可以不需要re.M),*允许匹配的内容出现的次数是(0-n),所以三行的内容全部输出
r2 = re.findall('GO+', s1) #输出后两行
r3 = re.findall('GO?', s1) #注意输出!!
print('r1',r1)
print('r2',r2)
print('r3',r3)
运行结果:G
GO
GOOO
r1 ['G', 'GO', 'GOOO']
r2 ['GO', 'GOOO']
r3 ['G', 'GO', 'GO'] #是匹配提取
5、{}控制表达式次数
import re
s1 = 'G\nGO\nGOOO'
print(s1)
r1 = re.findall('GO*', s1) #进行多行匹配,*允许匹配的内容出现的次数是(0-n),所以三行的内容全部输出
r2 = re.findall('GO{0,}', s1) #允许匹配的内容出现的次数是(0-n)和*一样
r3 = re.findall('GO{0,1}', s1)#允许匹配的内容出现的次数是(0-1)和?一样
print('r1',r1)
print('r2',r2)
print('r3',r3)
运行结果:G
GO
GOOO
r1 ['G', 'GO', 'GOOO']
r2 ['G', 'GO', 'GOOO']
r3 ['G', 'GO', 'GO']
6、[] 字符组:控制的是匹配内容
import re
s1 = 'test\nTesting\nzoo'
r1 = re.findall('[eio]', s1) #打印出s1中的'e' 'i' 'o'
r2 = re.findall('[e-o]', s1) #输出s1中在字母e和o之间的字母(是按照26个英文字母的顺序,不是字面意义上的‘之间’)
r3 = re.findall('^[eis]',s1,re.M)#三行没有以e开头的所以输出为[]
r4 = re.findall('[^eio]', s1) #匹配未包含e i o的字符
print('r1', r1)
print('r2', r2)
print('r3', r3)
print('r4', r4)
运行结果:r1 ['e', 'e', 'i', 'o', 'o']
r2 ['e', 'e', 'i', 'n', 'g', 'o', 'o']
r3 []
r4 ['t', 's', 't', '\n', 'T', 's', 't', 'n', 'g', '\n', 'z']
7、| 选择元字符
import re
s1 = 'pyt\npigone\npython\nworld'
r1 = re.findall('pyt|p',s1)
r2 = re.findall('p|pyt',s1) #选择的字符串如果有包涵关系,输出与选择的顺序有关
r3 = re.findall('p|h|o',s1)
print('r1',r1)
print('r2',r2)
print('r3',r3)
运行结果:r1 ['pyt', 'p', 'pyt']
r2 ['p', 'p', 'p']
r3 ['p', 'p', 'o', 'p', 'h', 'o', 'o']
8、分组元字符:() 将括号内的表达式定义为组
import re
s = 'd\ngo\doool'
r1 = re.findall('[d|g]o*',s) #表示的是o的前面可以i选择是d或g中的一个,o的个数可以是(0-n)
print('r1',r1) #['d', 'go', 'dooo']
r2 = re.findall('[d|g](o*)',s)
print('r2',r2) #是在r1的基础上再(o*)
运行结果:r1 ['d', 'go', 'dooo']
r2 ['', 'o', 'ooo']
9、转义元字符
取消字符串的转义可以在前面加r(这个python前面的基础里面应该都学了)
取消正则的语法转义,加\(只举这个的例子)
import re
s = 'py\npytho\npython'
r1 = re.findall('.',s) # . 通配符,匹配所有的单个字符
print('r1',r1)
r2 = re.findall('\.',s) #加了\ .就表示它本身,不再有通配符的含义
print('r2',r2) #由于字符串中没有 . 所以输出是一个空列表
运行结果:r1 ['p', 'y', 'p', 'y', 't', 'h', 'o', 'p', 'y', 't', 'h', 'o', 'n']
r2 []