正则表达式
1.正则的作用:
正则表达式是一种可以让复杂的字符串变得简单得工具
写正则表达式就是用正则符号来描述字符串规则
案例:判断一个字符串是否是一个合法得手机号码
from re import *
result = re.fullmatch(r'1[3-9]\d{9}',tel)
if result:
print('合法')
else:
print('不合法')
from re import fullmatch,findall ,search,split,sub,finditer,mach
2.正则语法
(1)fullmatch(正则表达式,字符串) —— 判断整个字符串是否满足正则表达式所描述的规则,匹配 成功返回匹配对象,失败返回None
(2)findall(正则表达式,字符串) ——提取字符串中所有满足正则表达式的子串,默认返回一个列表,列表中的元素是所有匹配到的子串(存在自动捕获现象)
(3) search(正则表达式,字符串) ——匹配字符串中第一个满足正则表达式的子串,匹配成功返回匹配对象,失败返回None
(4)spit(正则,字符串) —— 将字符串中所有满足正则的字串做为切割点进行切割
spit(正则,字符串,N) —— 将字符串中前N个满足正则的字串做为切割点进行切割
(5)sub(正则,字符串1,字符串2) ——将字符串2中所有满足正则的字串都替换成字符串1
sub(正则,字符串1,字符串2,N) ——将字符串2中前N个满足正则的字串都替换成字符串1
(6)finditer(正则,字符串 ) —— 获取字符串中满足正则的所有字串,返回
(7)match(正则, 字符串) - 匹配字符串开头
注意:python中表达式一个正则表达式一般使用r字符串
(1)普通符号 —— 在正则表达式中表示符号本身的符号
result = fullmatch(r'abc','dbc')
print(sesult) ##None
(2). ——匹配任意一个字符
result = fullmatch(r'.bc','dbc')
print(result)
#<re.Match object; span=(0, 3), match='dbc'>
(3)\d —— 匹配任意一个数字字符
result = fullmatch(r'\dbc','6bc')
print(result)
#<re.Match object; span=(0, 3), match='6bc'>
(4)\s —— 匹配任意一个空白字符
空白字符:空格(‘ ’)、换行(‘\n’)、水平制表符(‘\t’)
(5)\w —— 匹配任意一个字母、数字、下划线或者中文
result = fullmatch(r'abc\w123','abc_123')
print(result)
#<re.Match object; span=(0, 7), match='abc_123'>
(6)\D、\S、\W —— 分别和\d、\s、\w的功能相反
result = fullmatch(r'abc\D123','abc1123')
print(result)
#None
(7)[字符集] —— 匹配在字符集中的任意一个字符
[abc] :匹配a或b或c
[abc\d] :匹配a或b或c或任意数字
[1-5] : 匹配字符1到字符5中的任意一个字符
[a-z] :匹配任意一个小写字母
[A-Z] :匹配任意一个大写字母
[a-zA-Z] : 匹配任意一个字母
[\u4e00-\u9fa5] :匹配任意一个中文
result = fullmatch(r'abc[M9你]123','abc9123')
print(result)
##<re.Match object; span=(0, 7), match='abc9123'>
result = fullmatch(r'abc[M9你]123','abcx123')
print(result)
#None
(8)[ ^字符集] —— 匹配不在字符集中的任意一个字符
匹配类符号匹次数
(1) * —— 任意次数(0次或者1次或者任意次数)
注意: *放在谁的后面谁出现任意多次
a* —— a出现任意多次
\d —— 任意多个任意数字
(2)+ —— 一次或者多次(至少一次)
(3)? —— 0次或者1次(至多1次)
(4){}
- {N} ----- N次
- {M,N} —— M到N次
- {M,} —— 至少M次
- {,N} —— 最多N次
# 写一个正则表达式 ,可以匹配任意一个除了0的整数
result = fullmatch(r'[-+]?[1-9]\d*','520')
print(result)
(5)贪婪和非贪婪模式
在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最少的哪个次数
贪婪模式 :+、?、*、{M,N}、{M,}、{,N}
非贪婪模式:+?、??、*?、{M,N}?、{M,}?、{,N}?
result = search(r'a.+b','哒哒哒fjafjfkbkfbkkfb')
print(result)
#<re.Match object; span=(5, 18), match='afjfkbkfbkkfb'>
result = search(r'a.+?b','哒哒哒fjafjfkbkfbkkfb')
print(result)
#<re.Match object; span=(5, 11), match='afjfkb'>
4.分组和分支
1.分组
正则表达式中可以用()将部分内容括起来表示一个整体;括号括起来的部分就是一个分组
(1)整体操作的时候需要分组:
result = fullmatch(r'(\d\d[A-Z])+','09D15D65W36W')
print(result) #两个数字一个字母重复出现
(2)重复匹配 —— 正则中可以通过\M来重复他前面第M个分组匹配的结果
result = fullmatch(r'(\d\d)[A-Z]\1','90K90')
print(result)
(3)捕获 —— 提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)
findall在正则表达式中有分组的时候,会自动提取正则表达式中分组匹配到的内容
message = '技术上234,jsskf8992==技术njk==9223-ssjs123结束时间789'
result = findall(r'[\u4e00-\u9fa5](\d+)',message)
print(result)
#['234', '789'] ,找出文字后面是数字字符的所有数字
手动捕获:匹配对象.group(N) ——获取匹配结果中指定分组匹配到的内容
message = '我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\d\d\d)厘米,体重(\d\d)kg',message)
print(result) #<re.Match object; span=(11, 25), match='身高180厘米,体重70kg'>
print(result.group()) #身高180厘米,体重70kg
print(result.group(1),result.group(2)) #180 70
2.分支
正则1|正则2|正则3… —— 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配,…
5.转义符号
在本身具有特殊功能或者特殊意义的符号前加\,让特殊符号变成普通
result = fullmatch(r'\d+\d','23')
print(result)
#<re.Match object; span=(0, 2), match='23'>
result = fullmatch(r'\d\+\d','2+3')
print(result)
#<re.Match object; span=(0, 3), match='2+3'>
注意:单独存在有特殊意义的符号,在[]中他的功能也会自动消失