1、认识正则表达式
一种可以让复杂的字符串问题变得简单的工具,目的就是用正则符号描述字符串规则
- fullmatch -完全匹配
'''
fullmatch(正则表达式,字符串) -让整个字符串和正则表达式进行匹配,
匹配成功返回匹配对象,匹配失败返回None
python中表示一个正则表达式的方式:r'正则表达式'
'''
2、匹配类符号
用来约束字符串的某个位置必须是什么样的字符
- 普通字符(普通符号)
普通符号在正则表达式中表示符号本身
from re import fullmatch
result = fullmatch(r'abc','abc')
print(result)
- . -匹配任意一个字符
result = fullmatch(r'a.c','a1c')
print(result)
- \d -匹配任意一个数字字符
result = fullmatch(r'a\\dc','a5c')
print(result)
- \s -匹配任意一个空白字符
空白字符:空格、\n、\t
result = fullmatch(r'a\\sc','a c')
print(result)
- \w -匹配任意一个数字、字母、下划线或者中文
result = fullmatch(r'a\\wc','a哈c')
print(result)
- \D、\S、\W
'''
\\D -匹配任意一个非数字字符
\\S -匹配任意一个非空白字符
\\W -匹配任意一个非(数字、字母、下划线、中文)字符
'''
result=fullmatch(r'\\D\\S\\W','r5.')
print(result)
- [字符集] -匹配在字符集中的任意一个字符
'''
[多个字符] -匹配多个字符中的一个
[\\dxy] -匹配任意一个数字或者x或者y
[\\d\\s] -匹配任意一个数字或者任意一个空格
[1-9] -匹配数字1-9中任意一个
[a-z]、[A-Z]
[a-zA-z] -匹配任意一个字母
'''
result = fullmatch(r'a[123]c','a2c')
print(result)
result = fullmatch(r'a[0-9]b','a5b')
print(result)
-
[^字符集] -匹配不在字符集中的任意字符
注意:^只能放在最前面才有特殊功能
result = fullmatch(r'a[^0-9]b','alb')
print(result)
3、匹配类符号匹配次数
- * -匹配任意次数
'''
a* -任意个字符a
\\d* -任意个\\d(数字字符)
可以一个都没有
'''
result = fullmatch(r'x\\d*y','x46145625y')
print(result)
- + -至少一次
result = fullmatch(r'x\\d+y','x46145625y')
print(result)
- ? -最多一次(0次或1次)
result = fullmatch(r'x\\d?y','x4y')
print(result)
- {} -指定次数
'''
{N} -N次
{M,N} -M到N次
{M,} -至少M次
{,N} -最多N次
'''
result = fullmatch(r'x\\d{5}y','x12345y')
print(result)
-
贪婪和非贪婪
当匹配次数不确定的时候,匹配的时候分为贪婪模式和非贪婪模式两种,默认是贪婪,如果有多种次数都可以匹配成功,贪婪取最多的次数进行匹配,非贪婪取最少的次数
'''
match(正则表达式,字符串) -匹配字符串开头
贪 婪:直接写*、+、?、{}
非贪婪:*?、+?、??、{}?
'''
print(match(r'\\d{3}','265vssd'))
4、分组
() 在写正则表达式的时候可以使用()将正则表达式的部分内容括起来,被括起来的内容就是一个分组
4.1 整体操作
result = fullmatch(r'(\\d\\d[a-z]{3}){3}','12zsa15zxa26asa')
print(result)
4.2 重复
'''
重复:
在正则表达式中可以通过\\M来重复第M个分组中匹配到的内容
'''
result = fullmatch(r'(\\d\\d)[a-z]{3}\\1','12bbb12')
print(result)
4.3 捕获
'''
a、自动捕获:re模块中findall可以对正则表达式的匹配结果进行自动捕获(自动获取正则中分组匹配到的内容)
b、手动捕获:匹配对象.group() -获取整个正则匹配到的结果
匹配对象.group(N) -获取第N个分组匹配到的结果
'''
result = fullmatch(r'(\\d{2})([a-z]+)','12dd')
print(result.group()) #12dd
print(result.group(1)) #12
print(result.group(2)) #dd
5、分支和转义符
5.1 分支 |
正则1|正则2 -先用正则1进行匹配,如果匹配失败在正则2进行匹配
print(fullmatch(r'ab\\d{3}|ab[a-z]{2}','ab419'))
5.2 转义符
在有特殊功能的符号面前加\,让有特殊功能的符号变成一个普通符号
注意:单独存在有特殊功能符号在[]中会自动变成一个普通符号
print(fullmatch(r'\\d\\d\\.\\d','12.7'))
print(fullmatch(r'[+]\\d','+1'))
6、检测类符号
检测类符号:在匹配成功的情况下检测对应的位置是否符合相关要求
- \b -检测是否是单词边界(凡是可以把两个单词分开的符号:空白、英文的标点符号、字符串结尾)
str1 = '595buhjih95+muin895+9'
result = findall(r'\\d{3}\\b',str1)
print(result) #895
- \B -检测是否不是单词边界
print(findall(r'\\B\\d{3}',str1)) #895
- ^ -检测是否是字符串开头
print(findall(r'^\\d{3}',str1)) #595
- $ -检测是否是字符串结尾
print(search(r'^1[3-9]\\d{9}$','19102871957'))
7、re模块
re模块是python专门用来提供和正则表达式相关函数的模块
-
fullmatch(正则表达式,字符串)
完全匹配,正则表达式与就付出匹配,如果匹配成功返回匹配对象,匹配失败返回None
print(fullmatch(r'\\d','2'))
-
match
匹配字符串开头,正则表达式与字符串开头进行匹配,匹配成功返回匹配对象,匹配失败返回None
print(match(r'\\d{3}','123abc'))
-
search
匹配第一个字串(匹配字符串中第一个符合正则表达式规则的子串),如果匹配成功返回匹配对象,匹配失败返回None
print(search(r'\\d{3}','casfa594vdf569vdvf'))
-
findall
提取字符串中所有满足正则表达式的子串,返回值是一个列表
print(findall(r'\\d{3}','dsfa2625sdc4dv849538e'))
#['262', '849', '538']
-
finditer
提取字符串中所有满足正则表达式的子串,返回值是一个迭代器,迭代器中的元素是每一个匹配到的子串对应的匹配
print(finditer(r'\\d{3}','aef5898fawef569'))
<callable_iterator object at 0x000002C3E1E335E0>
-
split
将字符串中所有满足正则表达式的子串作为切割点对字符串进行切割
print(split(r'\\d{3}','dsfa2625sdc4dv849538e'))
#['dsfa', '5sdc4dv', '', 'e']
-
sub(正则表达式,字符串1,字符串2)
将字符串2中所有满足正则表达式的子串都替换成字符串1
print(sub(r'\\d{3}','黑','jvbjnrhd48s49878egwrsg4879ww'))
#jvbjnrhd48s黑78egwrsg黑9ww