import re
from re import*# 1. 正则的作用# 正则表达式是一种可以让复杂的字符串变得简单的工具。# 写正则表达式就是用正则符号来描述字符串规则# 案例1:判断一个字符串是否是一个合法的手机号码
tel ='23297293329'
result = re.fullmatch(r'1[3-9]\d{9}', tel)if result:print('合法')else:print('不合法')# 案例2:提取字符串中所有的数字子串,并且求和
str1 ='睡觉89jss=3.45-换手23=抗生素820=8'
result = re.findall(r'\d+\.?\d*', str1)print(sum([float(x)for x in result]))
正则符号
from re import fullmatch, findall, search,match, finditer, split, sub
# 1. re模块 - 提供了python中所有和正则相关的函数# fullmatch(正则表达式, 字符串) - 判断整个字符串是否满足正则表达式所描述的规则# findall(正则表达式, 字符串) - 提取字符串中所有满足正则表达式的子串# search(正则表达式, 字符串) - 匹配字符串中第一个满足正则表达式的字串# 注意:Python中表达式一个正则表达式一般使用r字符串# 2.正则符号# ========================第一类符号:匹配类符号========================# 1)普通符号 - 在正则表达式中表符号本身的符号
result = fullmatch(r'abc','abc')print(result)# 2). - 匹配任意一个字符
result = fullmatch(r'.bc','*bc')print(result)
result = fullmatch(r'.bc.','1bcu')print(result)# 3)\d - 匹配任意一个数字字符
result = fullmatch(r'\d\dabc','08abc')print(result)# 4)\s - 匹配任意一个空白字符# 空白字符:空格(' ')、换行('\n')、水平制表符('\t')
result = fullmatch(r'123\sabc','123\tabc')print(result)
result = fullmatch(r'\d\d\s\d','89 2')print(result)# 5)\w - 匹配任意一个字母、数字、下划线或者中文
result = fullmatch(r'abc\w123','abc和123')print(result)# 6)\D、\S、\W - 分别和\d、\s、\w的功能相反
result = fullmatch(r'abc\D123','abc8123')print(result)# None# 7)[字符集] - 匹配在字符集中的任意一个字符"""
[abc] - 匹配a或者b或者c
[abc\d] - 匹配a或者b或者c或者任意数字: [abc0123456789]
[1-5] - 匹配字符1到字符5中的任意一个字符
[a-z] - 匹配任意一个小写字母
[A-Z] - 匹配任意一个大写字母
[a-zA-Z] - 匹配任意一个字母
[a-zA-Z\d] - 匹配任意一个字母或者数字
[a-z=%]
[\u4e00-\u9fa5] - 匹配任意一个中文
"""
result = fullmatch(r'abc[M9你]123','abc你123')print(result)
result = fullmatch(r'abc[M9你\d]123','abc0123')print(result)
result = fullmatch(r'abc[\u4e00-\u9fa5]123','abc和123')print(result)# 8)[^字符集] - 匹配不在字符集中的任意一个字符
result = fullmatch(r'abc[^MN]123','abc)123')print(result)
result = fullmatch(r'abc[^a-z]123','abc$123')print(result)
result = fullmatch(r'abc[M^N]123','abcM123')print(result)print('--------------------------------华丽的分割线-------------------------------------')# ========================第二类符号:匹配次数符号========================# 匹配类符号匹次数# 1)* - 任意次数(0次或者1次或者次数)"""
a* - a出现任意多次
\d* - 任意多个任意数字
[abc]*
"""
result = fullmatch(r'1a*2','1aaaaaaaa2')print(result)
result = fullmatch(r'M\d*N','M13599N')print(result)
result = fullmatch(r'M[3-9]*N','M3489N')print(result)# 2)+ - 一次或者多次(至少1次)
result = fullmatch(r'1a+2','1aaa2')print(result)# 3) ? - 0次或者1次
result = fullmatch(r'1a?2','1aa2')print(result)# None# 4){}"""
{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次
"""
result = fullmatch(r'1a{3}2','1aaa2')print(result)
result = fullmatch(r'1a{3,6}2','1aaaa2')print(result)# 练习:写一个正则表达式,可以匹配任意一个除了0的整数。# 合法:233、+234、-7283、100、-2000# 不合法:0、0002、2.23、+-200
result = fullmatch(r'[+-]?[1-9]\d*','2000')print(result)# 5)贪婪和非贪婪模式"""
在匹配次数不确定的时候,如果有多种次数都可以匹配成功,贪婪取最多的那个次数,非贪婪取最少的那个次数。(默认是贪婪模式)
贪婪模式:+、?、*、{M,N}、{M,}、{,N}
非贪婪模式:+?、??、*?、{M,N}?、{M,}?、{,N}?
"""# 'ahkmb'、'ahkmb收拾b'、'ahkmb收拾b收b'
result = search(r'a.+b','收拾收拾收ahkmb收拾b收b3]er2')print(result)# <re.Match object; span=(5, 15), match='ahkmb收拾b收b'>
result = search(r'a.+?b','收拾收拾收ahkmb收拾b收b3]er2')print(result)# <re.Match object; span=(5, 10), match='ahkmb'># 'ahkmb'
result = search(r'a.+b','收拾收拾收ahkmb3]er2')print(result)# <re.Match object; span=(5, 10), match='ahkmb'>
result = search(r'a.+?b','收拾收拾收ahkmb3]er2')print(result)# <re.Match object; span=(5, 10), match='ahkmb'>print('--------------------------------华丽的分割线-------------------------------------')# ========================第三类符号:分组和分支========================# 1)分组 - ()"""
正则表达式中可以用()将部分内容括起来表示一个整体;括号括起来的部分就是一个分组。
a. 整体操作的时候需要分组
b. 重复匹配 - 正则中可以通过\M来重复它前面第M个分组匹配的结果
c. 捕获 - 提取分组匹配到的结果(捕获分为自动捕获(findall)和手动捕获)
"""# '23M'、'89K10L'、'09H23P90Q33W'、...
result = fullmatch(r'(\d\d[A-Z])+','09H23P90Q33W')print(result)# '23M23'、'90K90'、'78N78'、'10U10'
result = fullmatch(r'(\d\d)[A-Z]\1','90K90')print(result)
result = fullmatch(r'(\d{3})([a-z]{2})=\2\1{2}','234km=km234234')print(result)# findall在正则表达式中有分组的时候,会自动提取正则匹配结果中分组匹配到的内容
message ='技术上234,jsskf8992==技术njk==9223-ssjs233结束时间453'
result = findall(r'[\u4e00-\u9fa5](\d+)', message)print(result)# 匹配对象.group(N) - 获取匹配结果中指定分组匹配到的内容# 提取身高
message ='我是小明,今年23岁,身高180厘米,体重70kg'
result = search(r'身高(\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 70print('--------------------------------华丽的分割线-------------------------------------')# 2)分支 - |"""
正则1|正则2|正则3|... - 先用正则1进行匹配,匹配成功直接成功;匹配失败用正则2进行匹配,....
"""
result = fullmatch(r'\d{3}|[a-z]{2}','mn')print(result)# 'abc34'、'abcKJ'、'abc78'、'abcOP'
result = fullmatch(r'abc\d\d|abc[A-Z]{2}','abc23')print(result)
result = fullmatch(r'abc(\d\d|[A-Z]{2})','abcKS')print(result)print('--------------------------------华丽的分割线-------------------------------------')# ===========================转义符号===============================# 转义符号:在本身具有特殊功能或者特殊意义的符号前加 \ ,让特殊符号变成普通# 匹整数部分和小数部分都是两位数的小数
result = fullmatch(r'\d\d\.\d\d','23.45')print(result)
result = fullmatch(r'\d\+\d','3+4')print(result)# '(amd)'
result = fullmatch(r'\([a-z]{3}\)','(jsk)')print(result)# 注意:单独存在有特殊意义的符号,在[]中它的功能会自动消失
result = fullmatch(r'\d[+.?*()\]]\d','3]4')print(result)