正则表达式:用正则符号来描述字符串规则
提供了Python中所有和正则相关的函数
fullmatch(正则表达式,字符串)
判断整个字符串是否满足正则表达式,匹配成功返回对象,不匹配返回None
print(fullmatch(r'\d{3}', '234'))
print(match(r'\d{3}', '234卡咖啡'))
findall(正则表达式,字符串)
提取字符串中所有满足正则表达式的字符串,默认返回一个列表,了;列表中的元素是所有匹配到的子串(存在自动捕获的现象)
msg = """
'name:"jshf2-
2ss技术"'
"""
result = findall(r'(?s)name:"(.+)"', msg)
print(result)
search(正则表达式,字符串)
匹配字符串中满足正则表达式的第一个字符串,匹配成功返回匹配对象,匹配失败返回None
split(正则表达式,字符串,[N])
按照所有满足正则表达式的子串进行切割(N代表切割n次)
str1 = '技术7晋级赛7jsks7就开始看'
print(str1.split('7', 2))
str1 = '技术22晋级赛709jsks511就开始80看'
print(split(r'\d+', str1, 2))
finditer(正则表达式,字符串)
获取字符串中所有满足正则的子串返回一个迭代器,迭代器中的元素是匹配对象(有分组存在时,最好用finditer)
str1 = '技术22晋级赛709jsks511就开始80看'
result = finditer(r'\d+', str1)
print(list(result))
sub(正则表达式,字符串1,字符串2,[N])
将字符串2中所有满足正则的子串都替换成字符串1替换n次
str1 = '技术22晋级赛709jsks511就开始80看'
print(sub(r'\d', '+', str1))
message = '妈的,SB,都打起来了你还在打野!草!F u c k'
print(sub(r'(?i)妈的|sb|草|操|艹|f\s*u\s*c\s*k', '*', message))
match(正则表达式,字符串)
匹配字符串开头
匹配类符号 - 描述字符
普通字符
from re import fullmatch
print(fullmatch(r'abc','abc'))
# 结果为TRUE
.
表示匹配任何字符
# 表示3个字符开头是a最后是c
r'a.c'
# abc acc aqc 都能匹配
\d
表示匹配任意一个数字字符
r'a\dc'
# a1c a2c a3c都能匹配
\s
表示匹配一个空白字符
# 空格 回车 \t
r'a\sc'
# a c
\w
匹配一个任意字母数字下划线
\D
\S
\W
功能与小写相反
[字符集]
匹配字符集中任意一个字符
# 1.在中括号中提供多个祖父(匹配任意一个)
r'[adb]'
# 2.表示范围(匹配字符1到字符2 编码值范围内的任意一个字符)
r'[字符1-字符2]' #字符1的编码值必须小于字符2的编码值
r'[\u4e00-\u9fa5]' #匹配中文
r'[a-zA-Z]' #匹配小写字母a到小写字母z和大写字母A到大写字母Z
# c.在中括号中包含\开头的特殊符号
r'[\da-z]' #匹配数字和小写字母
r'[\d\u4e00-\u9fa5] #匹配数字和中文
[^字符集]
匹配不在字符集中的任意字符
匹配次数
+
匹配一次或多次(控制加号前的匹配次数)
r'a+' #匹配一个或多个a
r'\d+a' #匹配一个或者多个数字和a
r'a[1-5]c'
'a234c'
*
匹配0次和任意次数
?
匹配一次或0次
{}
{N}
匹配N次{M,N}
匹配M-N次{M,}
匹配至少M次{,N}
匹配最多N次贪婪和非贪婪
贪婪
+
*
{}
{N}
{M,N}
{M,}
{,N}
在匹配成功或者多种匹配次数都可以匹配成功的时候,贪婪取最多的次数进行匹配
match(r'a.+b','amnb还b上课')#匹配amnb
非贪婪(匹配次数后面加问号)
+?
*?
{}?
{N}?
{M,N}?
{M,}?
{,N}?
在多种匹配次数都可以匹配成功的时候,非贪婪取最少的次数进行匹配
match(r'a.+?b','amnb还b上课')#匹配amnb还b
分组和分支
分组 ()
正则表达式中可以用()
将部分内容括起来表示一个整体,括号括起来的部分就是一个分组
整体操作
控制整体匹配次数
# '23k' ,'23j24k23m','12b32n43n54n31k'
result = fullmatch(r'(\d\d[a-z])+','23j24k23m')
重复匹配
正则中可以通过\M来重复他前面第M个分组匹配的结果
# '99k99' '78k78'
result = fullmatch(r'(\d\d)[a-z]\1','78k78')
result = fullmatch(r'(\d\d)[a-z]\1{2}','78k7878')
捕获
提取分组匹配到的结果(分为自动捕获findall
和手动捕获)
自动捕获
# findaLl在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
message="技术上234, jsskf8992==技术njk==9223-ssjs233结束时间453‘
result = findall(r' [1u4e00-1u9fa5]C1d+)’,message)
print(result)
手动捕获
# 匹配对象.group(N)
message = 我是小明,今年23岁,身高180厘米,体重7okg’
result = search(r’身高(\d+〕厘米,体重(\d+)kg’, message)
print (result)
#
print(result.group ())
# '身高180厘米,体重7okg’
print(result.group (1), result.group (2))
# 180 70
分支
正则1|正则2|正则3|....
---------先用正则1进行匹配,匹配成功直接成功,匹配失败用正则2进行匹配
result = fullmatch(r'abc\d\d|abc[A-Z]{2}','abc12')
result = fullmatch(r'abc(\d\d|[A-Z])','abc12')
检测类符号
转义符号
在本身具有特殊功能或特殊意义的符号前加\
,让特殊符号变成普通符号
result = fullmatch(r'\d\d\.\d\d','23.66')
print(result)
result = fullmatch(r'\d\d\+\d\d','23+66')
print(result)
独立存在有特殊意义的符号在[]
中他的功能会消失,也就是在中括号中想要有特殊意义的字符有功能,则需要在该字符前加上\
result = fullmatch(r'\[\d\d\+\d\d\]','[23+66]')
print(result)
在正则表达式前加(?i)
fullmatch(r'(?i)abc','abc')
在正则表达式前加上(?s)
多行匹配:.
不能和换行符进行匹配
fullmatch(r'abc.123','abc\n123') #匹配失败返回None
单行匹配
fullmatch(r'(?s)abc.123','abc\n123') #匹配成功返回匹配对象