一、什么是正则表达式

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 []