Day17-正则
1.认识正则
-
什么是正则表达式-----正则表达式是一个可以让复杂字符串问题变得简单的工具
验证输入的数据是否是一个合法的手机号 from re import * # result = fullmatch(r'1[3-9]\d{9}', tel) # if result: # print('是手机号') # else: # print('不是手机号')
2.正则匹配符号
-
-
普通字符
-
. - 匹配任意一个字符
-
\d - 匹配任意一个数字
-
\s - 匹配任意一个空白字符
-
\w - 匹配任意一个数字、字母、下划线或者中文
-
\D、\S、\W - 反斜杠后面跟大字母和对应的小写字母的功能相反
-
[字符集] - 匹配在字符集中的任意一个字符
用法1: 中括号中直接写多个普通字符,例如:[ma1,]
用法2: 中括号中包含反斜杠开头的特殊符号, 例如:[ma1,\d]
用法3: 中括号中减号放在两个字符之间表示范围,例如: [1-7]、[a-z]、[A-Z]、[a-zA-Z]、 [mn1-7]、[\u4e00-\u9fa5] 注意:[]中-在两个字符之间才表示从谁到谁,并且减号前面的字符的编码值必须小于减号 后面的字符的编码值;
[^字符集] - 匹配任意一个不在字符集中的任意一个字符
-
3.正则匹配次数
-
-
+匹配1次或者多次(至少1次)
-
*匹配0次或者多次(匹配任意多次)
-
? 匹配0次或者1次
-
{}----匹配{}内的次数
{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次# 练习2:写一个正则表达式匹配一个变量名,变量名要求:由数字、字母下划线组成,数字不能开头 name = '9ab2c' result = fullmatch(r'[a-zA-Z_][a-zA-Z_\d]*', name) if result: print('合法') else: print('不合法')
-
4.贪婪和非贪婪
在匹配次数不确定的情况下,匹配模式分为贪婪和非贪婪两种。
1)贪婪(默认) - 在能匹配成功的前提下,如果有多种次数都能匹配成功,取最大次数。
+、*、?、{M,N}、{M,}、{,N}
2)非贪婪 - 在能匹配成功的前提下,如果有多种次数都能匹配成功,取最小次数。
+?、*?、??、{M,N}?、{M,}?、{,N}?
# 2 -> amnb
# 6 -> amnb数据复b
# 9 -> amnb数据复baab
result = match(r'a.+b', 'amnb数据复baab计算机')
print(result)
result = match(r'a.+?b', 'amnb数据复baab计算机')
print(result)
5.分组和分支
-
分组: ()
1)整体控制 - 将正则中需要看成一个整体来控制次数的地方用()括起来,作为一个分组
2)重复 - 在正则中可以通过\M来重复它前第M个分组匹配到的结果
3)捕获 - 获取指定分组中的匹配结果 (findall会自动捕获分组内容)# 案例1:匹配,两个数字两个大写字母的结构重复三次:'12MN67HJ89KJ' result = fullmatch(r'(\d\d[A-Z]{2}){3}', '12MN67HJ89KJ') print(result) # 案例2:匹配, '23a23'、'99a99'、'80a80' result = fullmatch(r'(\d\d)a\1', '80a80') print(result)
-
分支 - |
正则1|正则2 - 字符串如果可以和两个正则中的任意一个正则匹配成功就能匹配成功,两个都不能匹配就匹配失败
# 'abc728'、'abcMH'
result = fullmatch(r'abc\d{3}|abc[A-Z]{2}', 'abc342')
print(result)
result = fullmatch(r'abc(\d{3}|[A-Z]{2})', 'abcKJ')
print(result)
6.检测类符号
-
\b - 检测\b所在的位置是否是单词边界
检测类符号的工作原理:先匹配(在匹配的时候不用管检测符号),在匹配成功后再检测检测类所在的位置是否符合相关要求
单词边界: 空白符号、英文的标点符号、字符串开头和字符串结尾
result = findall(r'\b\d+\b', '881爱好728,数据m 8923就是,sjka829 80, 换手机90') print(result)
-
^ - 检测是否是字符串开头
-
$ - 检测是否是字符串结尾
result = search(r'\d{3}$', '黑色金属2728jksjf829') print(result) result = search(r'^\d{3}$', '723') print(result)
7.转义字符
-
在本身具备特殊意义或者特殊功能的符号前加,让这个符号变成一个普通符号
-
在[]外面独立存在有特殊意义的符号,在[]里面会自动变成普通符号, 例如:.、+、*、?、$等
result = fullmatch(r'\d\.\d', '2.3') print(result)
8.正则语法
语法 | 功能 |
---|---|
fullmatch(正则, 字符串) | 完全匹配 |
match(正则, 字符串) | 匹配字符串开头 |
search(正则, 字符串) | 匹配字符串中第一个满足正则的子串 |
findall(正则, 字符串) | 获取字符串中所有满足正则的子串 |
sub(正则, 字符串1, 字符串2) | 将字符串2中所有满足正则的子串都替换成字符串1 |
split(正则, 字符串) | 将字符串中所有满足正则的字串作为切割点对字符串进行切割 |