from re import fullmatch, search, findall
正则表达式:r‘正则语法’
1、正则表达式
1)概念:
正则表达式是处理字符串的工具,通过不同的正则符号来描述字符串的规则
2)正则符号(语法)
=================匹配符号=================
a、普通字符:除了在正则中有特殊功能和特殊意义的符号以外的字符
普通字符代表字符本身
b、字符 . ——匹配任意一个字符(一个点只能匹配一个字符)
c、 \w ——匹配一个数字、字母、下划线(前提是在ASCII码表中)(供了解)
d、 \d ——匹配任意一个数字字符
e、 \s ——匹配任意一个空白字符(空格字符、换行字符、制表符...)
f、 \大写字母 ——匹配除了 \小写字母 外的任意字符
\D ——匹配一个非数字字符
\S ——匹配一个非空白字符
g、 [字符集] ——匹配字符集出现的任意一个字符(一个[]只能匹配一个字符)
[1-9] ——匹配1到9中任意一个字符(字符编码递增)
[a-z] ——匹配任意一个小写字母
[a-zA-Z] ——匹配任意一个字母
[a-zA-Z\d_] ——匹配任意一个字母数字下划线
[ \t\n] ——匹配任意一个空白字符
[\u4e00-\u9fa5] ——匹配任意一个中文字符
h、 [^字符集] ——匹配不在字符集中的任意一个字符
re_str = r'abc' # 长度为3
print(fullmatch(re_str, 'abc')) # 匹配成功
re_str = r'abc..123' # 长度为8
print(fullmatch(re_str, 'abc+=123')) # 匹配成功
re_str = r'\wabc' # 长度为4
print(fullmatch(re_str, '_abc')) # 匹配成功
re_str = r'\d\dabc' # 长度为5
print(fullmatch(re_str, '32abc')) # 匹配成功
re_str = r'\s...' # 长度为4
print(fullmatch(re_str, ' ty5')) # 匹配成功
re_str = r'[zzybrx]' # 长度为1
print(fullmatch(re_str, 'b')) # 匹配成功
re_str = r'[\u4e00-\u9fa5]' # 长度为1
print(fullmatch(re_str, '钟')) # 匹配成功
================检测符号==================
所有的检测符号都不会影响字符串的长度
a、 \b ——检测是否是单词边界
单词边界:能够将两个单词隔开并且不会产生歧义的任意符号
——空白字符、标点符号、-、字符串开头和字符串结尾
匹配规则:先去掉\b对字符串进行匹配,如果匹配成功再检查
\b所在的位置是否是单词边界
b、 ^ ——检查 ^ 所在的位置是否是字符串开头([]外面)
c、 $ ——检查$所在位置是否是字符串结尾
print(fullmatch((r'abc,\b123'), 'abc,123')) # 匹配成功
print(search(r'\b\d\d\b', 'jienv 45 swrr12rrfg')) # 搜索成功
print(findall((r'\d\d\d'), '234erfgs4568ee905er')) # ['234', '456', '905']
控制次数的符号(字符符号)
1、 * ——某个字符匹配0次或者多次
123a* ——123后面a出现0次或者多次,123、123a、123aa
123\d* ——123后面出现0个或者多个任意数字字符,123、1232、123456
2、 + ——某个字符匹配1次或者多次
3、 ?——某个字符匹配0次或者1次
4、 {}
{N} ——某个字符匹配N次
{M,N} ——某个字符匹配M到N此(至少M次,最多N次)
{M,} ——某个字符匹配至少M次
{,N} ——某个字符匹配最多N次
5、 贪婪和非贪婪
在匹配次数不确定的时候,会出现贪婪和非贪婪两种情况,默认情况都是贪婪
贪婪:在能够匹配成功的前提下,匹配次数尽可能多
非贪婪:在能够匹配成功的前提下,匹配次数尽可能少(在匹配次数后加?)
练习1:写一个正则表达式匹配一个字符:abc的前面是两个数字或者两个大写字母
======================分之==========================
正则1|正则2
——先让正则1去匹配,成则成,失败正则2去匹配(只要有一个匹配成功就好)
r‘\d\dabc|[a-z]{2}abc’
=======================分组=========================
1、() ——将括号里面的内容作为一个整体
a、整体操作
r'(\d\d|[a-z]{2})abc' ——匹配一个字符串后面是abc,前面是两个数字或者两个大写字母
r'([a-z]\d){3}' ——某一段字符串重复出现
b、分组操作
分组截取:r'(\d{3})([a-z]{3})' ——方便后面分段或者分情况取到不同的匹配结果(不影响匹配)
分组重复:r'(\d{3})[a-z]{3}\1' ——用\X来重复前面第X个分组匹配到的内容(\X前面必须有这个分组)
=====================转义符号======================
1、加 \
在正则中有特殊功能和特殊意义的符号前加 \ ,让这个符号的特殊功能和意义消失
2、加[]
在[]中有特殊意义的符号:a、^放在开头 b、-放在两个字符之间
其他符号包括:. + ? * $ ,这些单独的符号在[]中都是符号本身
print(fullmatch(r'\n\d{3}\+[a-z]{3}', '\n123+abc')) # 匹配成功
re模块
——是Python提供的专门针对正则表达式应用的相关函数
from re import *
1、compile(正则表达式)——将正则表达式转换成正则对象
2、字符串匹配
fullmatch(正则表达式,字符串)——正则表达式与字符串完全匹配
match(正则表达式,字符串)——匹配字符串开头
——以上两个方法的结果:匹配失败是None,匹配成功返回匹配对象
3、查找
search(正则表达式,字符串)——在字符串中查找第一个满足正则的子串
如果找到了结果是匹配对象,否则为None
findall(正则表达式,字符串)——获取字符串中所有满足正则表达式的子串,
返回值是一个列表
注意:如果正则中有分组,列表中的匹配结果只会取分组匹配到的内容
finditer(正则表达式,字符串)——获取字符串中所有满足正则的子串,
返回值是一个迭代器,元素是匹配对象
result = finditer(r'(\d{3})([a-z]{2})', '是234hu士大夫345mmks89h=数348kl几十')
group = []
group1 = []
group2 = []
for x in result:
group.append(x.group())
group1.append(x.group(1))
group2.append(x.group(2))
print(group)
print(group1)
print(group2)
4、切割
split(正则表达式,字符串)——将字符串中满足正则的子串作为切割点对字符串进行切割
返回一个字符串列表
5、替换
sub(正则表达式,字符串1,字符串2)——将字符串2中所有满足正则的子串都替换成字符串1
补充:匹配对象
result = fullmatch(r'\d{3}=[a-z]{3}', '234=abc')
print(result)
1、获取匹配到的字符串
匹配对象.group()——获取整个正则表达式匹配到的字符串,结果是字符串
匹配对象.group(N)——获取整个正则表达式中第N个分组匹配到的字符串
2、获取匹配到的字符串在原字符串中的范围
匹配对象.span()——返回匹配结果在原字符串中的下标范围,[开始下标,结束下标)
匹配对象.span(N)——返回第N个分组匹配到的结果在原字符串中的范围
3、获取原字符串
匹配对象.string
print(result.group())
print(result.span())
print(result.string)