写正则表达式的目的:用正则符号描述字符串规则
python中提供正则表达式的方法:r'正则表达式'
一、定义
一种可以让复杂的字符串问题编程简单的工具问题
1、fullmatch → 完全匹配
fullmatch(正则表达式,字符串) → 让整个字符串和正则表达式进行匹配,匹配 成功返回 匹配对象,匹配失败返回None
2、math(正则表达式,字符串)→ 匹配字符串开头
二、匹配类符号
是用来约束字符串的某个位置必须是什么样的字符
1、普通字符(普通符号):普通符号在正则表达式中表示符号本身
2、. → 匹配一个任意字符
3、\d → 匹配任意一个数字字符
4、\s → 匹配任意一个空白字符(空表字符:空格、\n(换行)、\t)
5、\w → 匹配任意一个数字、字母、下划线或者中文
6、\D、\S、\W
(1)\D → 匹配任意一个非数字字符
(2)\S → 匹配任意一个非空白字符
(3)\W → 匹配任意一个非(数字、字母、下划线、中文)字符
7、[字符集] → 匹配在字符集中的任意一个字符
(1)[多个字符] → 匹配多个字符中的任意一个
(2)[\dxy] → 匹配任意一个数字或者一个x或者一个y
(3)[\d\s] → 匹配任意一个数字或者任意一个空白字符
(4)[1-9] → 匹配数字字符1到9中的任意一个字符
(5)[a-z] → 匹配任意一个小写字母
(6)[A-Z] → 匹配任意一个大写字母
(7)[a-zA-Z] → 匹配任意一个字母
(8)[\u4e00-\9ufa5] → 匹配任意一个中文
8、[^字符集] → 匹配不在字符集中的任意一个字符
注意:[]中,^只有放在最前面的时候才有特殊功能,-只有放在两个字符之间的时候才有特殊功能
三、匹配次数
1、* → 匹配任意次数(包括零次)
(1)a* → 任意个字符a
(2)\d* → 任意个\d(任意多个任意数字字符)
2、+ → 至少一次
3、? → 最多1次(0次或1次)
4、{}
(1){N} → N次
(2){M,N} → M到N次
(3){M,} → 至少M次
(4){,N} → 最多N次
5、贪婪和非贪婪
(1)当匹配次数不确定的时候,匹配的时候分为贪婪模式和非贪婪模式两种,默认的匹配的模式是贪婪的
(2)如果有多种次数都可以匹配成功,贪婪取最多的次数进行匹配;非贪婪取最少的次数进行匹配
(3)写法:
a.贪婪:*、+、?、{M,N}、{M,}、{,N}
b.非贪婪:*?、+?、??、{M,N}?、{M,}?、{,N}?
四、分组
在写正则表达式时可以使用()将正则表达式的部分内容括起来,被括起来的内容就是一个分组
1、整体操作
from re import *
result = fullmatch(r'\d\d[a-z]{3}\d\d[]a-z]{3}\d\d[a-z]{3}','23mks23jon39kso')
print(result)
result = fullmatch(r'([A-Z]\d)+', 'M3B4J4B3')
print(result)
2、重复
在正则表达式中可以通过\M来重复前面第M个分组中匹配到的内容
print(fullmatch(r'(\d\d)[A-Z]{3}\1', '78SAD78'))
print(fullmatch(r'(\d{3})=([a-z]{2})\1\2{2}--\1','342=da342dada--342'))
3、捕获
(1)自动捕获:re模块中finfall可以对正则表达式的匹配结果进行捕获(自动捕获正则中分组匹配到的结果)
result = findall(r'\d{2}[\u4e00-\u9fa5]','21事件后ghih29集==234432nhiuh22是')
print(result) # ['21事', '29集', '22是']
print('--------------------分割线-------------------')
result = findall(r'(\d{2})[\u4e00-\u9fa5]','21事件后ghih29集==234432nhiuh22是')
print(result) # ['21', '29', '22']
(2)手动捕获:
匹配对象.group() → 获取正则匹配到的结果
匹配对象.group(N) → 获取第N个分组匹配到的结果
result = fullmatch(r'(\d{2})([a-z]+)','78gvun')
print(result) # <re.Match object; span=(0, 6), match='78gvun'>
print(result.group()) # 78gvun
print(result.group(1)) # 78
print(result.group(2)) # gvun
五、分支和转义字符
1、分支 → |
正则1|正则2 → 先用正则1进行匹配,如果匹配失败再正则2进行匹配
print(fullmatch(r'ab\d{3}|ab[a-z]{2}', 'ab798'))
# <re.Match object; span=(0, 5), match='ab798'>
print(fullmatch(r'ab(\d{3}|[a-z]{2})', 'abdf'))
# <re.Match object; span=(0, 4), match='abdf'>
2、转义字符
在正则表达式中,有特殊功能的符号前面加\,让有特殊功能的符号变成一个普通符号
print(fullmatch('\d+\+\d+','23+342'))
# <re.Match object; span=(0, 6), match='23+342'>
print(fullmatch('\(\d{3}\)-\d{5}','(231)-34253'))
# <re.Match object; span=(0, 11), match='(231)-34253'>
注意:单独存在有特殊功能的符号在[]中会自动变成一个普通符号
六、检测类符号
在匹配成功的前提下,检测对应的位置是否符合相关要求
1、\b → 检测是是否是单词边界
单词边界(分开两个单词):空白符号、英文标点符号、字符串开头和字符串结尾
result = findall(r'\d{3}\b', '123asdfdw231s的地位1231')
print(result)
2、\B → 检测是否不是单词边界
3、^ → 检测是否是字符串开头(放在正则表达式前面)
4、$ → 检测是否是字符串结尾(放在正则表达式结尾)
七、re模块
re模块是python专门用来提供正则表达式相关函数的模块
from re import fullmatch、match、search、findall、finditer、split、sub
1、fullmatch(正则表达式,字符串)→ 完全匹配(让正则表达式和整个字符串进行匹配),如果匹配成功返回匹配对象,匹配失败返回None
2、match(正则表达式,字符串)→ 匹配字符串开头(让正则表达式和整个字符串开头进行匹配),如果匹配成功返回匹配对象,匹配失败返回None
3、search(正则表达式,字符串)→ 匹配第一个子串(匹配字符串中第一个符合正则表达式规则的字串),如果匹配成功返回匹配对象,匹配失败返回None
4、findall(正则表达式,字符串)→ 提取字符串中所有满足正则表达式的子串,返回值是一个列表,列表中的元素是匹配到的所有内容(会自动捕获)
5、finditer(正则表达式,字符串)→ 提取字符串中所有满足正则表达式的字串,返回值是一个迭代器,迭代器中的元素是每一个匹配到的字串对应的匹配对象(不会自动捕获)
6、split(正则表达式,字符串)→ 将字符串中所有满足正则表达式的字串作为切割点对字符串进行切割
7、sub(正则表达式,字符串1,字符串2)→ 将字符串2中所有满足正则表达式的字串全部替换成字符串1