正则表达式的规则:
基本正则:

区间匹配 []:可以根据编码顺序来规定范围
A:65 a:97 Z:90 z:122
re.findall(r"[pP]ython","Python or python")的匹配结果包括python 和 Python
[]里面的内容表示里面内容任选一个
一个一个字符从左往右依次匹配 匹配成功就扔进列表
也可以这么用[A-Za-z]表示大写字母和小写字母 也可以[A-z]

区间取反:
re.findall(r"^[pP]ython","Python or python")
前面表示p或者P接一个ython

匹配或:
re.findall(r"python|Python","Python or python")
匹配python和Python

占位符:表示除\n之外的任意一个字符
re.findall(r"p.thon","Python or python")
匹配p*thon

匹配开始与结束 (^ $):
re.findall(r"^python","Python or python")
表示匹配字符串开头为python
re.findall(r"python$","Python or python")
表示匹配字符串结尾为python

正则表达式的快捷方式:
使用ppt的截图
\w:里面包括中文字符,大小写和下划线
一次一个\d表示只匹配一个数字
\b:只是表示词边界 不代表任何字符 表示那个地方前面必须不是一个单词字符(给陈的截图)
    如print(re.findall(r'\bw','agad#wwwwad'))输出w
\B:表示非词边界 表示词边界那个地方前面是个单词字符

正则重复:
通配符: * ? +
? 表示匹配前一项0次或1次
如 ret=re.findall(r'py?','python p pyy ps') 表示y出现0次或1次 结果是[py,p,py,p]

+ 表示匹配前一项一次以上
如 ret=re.findall(r'py+','python p pyy ps') 表示y出现1次及以上 结果是[py,pyy]

* 表示匹配前一项任意次(0-n次)
如 ret=re.findall(r'py*','python p pyy ps') 表示y出现次数为0-n次 结果为[py,p,pyy,p]

{n,m} 表示匹配前一项n-m次
如 ret=re.findall(r'py{2,4}','python p pyy pyyy') 表示y出现次数为2-4次 结果为[pyy,pyyy]

{n} 表示匹配n次
如 ret=re.findall(r'py{2}','python p pyy pyyy') 明确表示y出现次数为2次 结果就为[pyy,pyy]

贪婪模式和非贪婪模式
贪婪模式 尽可能匹配到长的字符串 (不设置就默认)
非贪婪模式 匹配到就输出(在正则重复后面加?: +? *? {n,m}?等同于{n})
msg='cats and dogs,cats1 and dog1'
re.findall(r'cats.*s',msg)
re.findall(r'cats.*?s',msg)
结果:
['cats and dogs,cats']
['cats and dogs']

正则分组:
match对象的group函数 默认参数为0 表示输出匹配的所有字符串
                    参数n(n>0)表示输出第几个分组匹配到的内容
import re
msg='135-0960-5926'
ret=re.search(r'(\d{3})-(\d{4})-(\d{4})',msg)
print(ret.group()) 135-0960-5926
print(ret.group(1)) 135
print(ret.group(2)) 0960
print(ret.group(3)) 5926
print(ret.groups()) #('135', '0960', '5926') 将组里面的对象变成了一个元组里面的元素

分组向后引用:
捕获分组 --分组之后匹配到的数据都是暂时放在内存里,并且给定一个从1开始的索引
        所以,捕获分组蚀刻液向后引用 \1 \2
msg='135-0960-0960'
ret=re.search(r'(\d{3})-(\d{4})-\2',msg) 这种能捕获上 因为\2表示0960
ret=re.search(r'(\d{3})-(\d{4})-\2',172-0960-5926) 这种不能捕获上 因为\2表示0960

非捕获分组
(?:然后加正则表达式)
只分组 不捕获 不会将捕获到的内容临时存放在内存 不能使用分组向后引用
msg='135-0960-0960'
ret=re.search(r'(?:\d{3})-(\d{4})-\1',msg) 这时候的\1是0960

如果有捕获分组,findall只会匹配显示捕获分组内容
import re
msg='135-0960-0960'
ret=re.findall(r'(?:\d{3})-(\d{4})-\1',msg)
print(ret)  只会输出   ['0960']