# 案例1:写程序判断一个字符串是否是一个合法的手机号
str1 ='13678192323'# 方法1:不使用正则 iflen(str1)!=11:print('不合法')else:if str1[0]!='1':print('不合法')else:if str1[1]in'012':print('不合法')else:for x in str1[2:]:ifnot x.isdigit():print('不合法')breakelse:print('合法')# 方法2:使用正则 from re import fullmatch, split
if fullmatch(r'1[3-9]\d{9}', str1):print('合法')else:print('不合法')# 案例2:将字符串中所有的数字子串作为切割点进行切割
str1 ='amn23kjs892换手技术34江苏师范'
result = split(r'\d+', str1)print(result)
result = fullmatch(r'1\D2\S3\W','1,2集3#')print(result)
7)[字符集] - 匹配在字符集中的任意一个字符
1)[MNA] - 匹配M或者N或者A
2)[\dMN] - 匹配任意一个数字或者M或者N
3)[1-9] - 匹配数字字符1到9中的任意一个
4)[a-z] - 匹配任意一个小写字母
5)[\u4e00-\u9fa5] - 匹配任意一个中文
6)[a-zA-Z] - 匹配任意一个字母
9)[a-zA-Z\d] - 匹配任意一个字母或者数字
10)[a-zA-Z\d+] - 匹配任意一个字母或者数字或者+
# 'aAb'
result = fullmatch(r'a[MNA]b','aMb')print(result)# '+34'、'-45'、'-98'
result = fullmatch(r'[+-]\d\d','+90')print(result)
result = fullmatch(r'a[MN\d]b','aMb')print(result)
result = fullmatch(r'a[1-8]b','a2b')print(result)
result = fullmatch(r'a[\u4e00-\u9fa5]b','a是b')print(result)
8)[^字符集] - 匹配不在字符集中的任意一个字符
result = fullmatch(r'a[^MN]b','a@b')print(result)
result = fullmatch(r'a[^A-Z]b','amb')print(result)
三、匹配次数
from re import fullmatch,match,findall
1. * - 任意次数(包括0次)
result = fullmatch(r'a\d*b','a890b')print(result)
result = fullmatch(r'a*\db','aaaa3b')print(result)
result = fullmatch(r'a[A-Z]*b','aMMKb')print(result)
2. + - 至少1次
result = fullmatch(r'a\d+b','a23b')print(result)
3. ? - 最多1次(0次或者1次)
‘-7283’
result = fullmatch(r'-?\d+','-2344')print(result)
4. {}
{N} - N次
{M,N} - M到N次
{M,} - 至少M次
{,N} - 最多N次
result = fullmatch(r'\d{3,5}abc','2492abc')print(result)
# 2 5 8
result =match(r'a.+b','amnb你好b12b开始三大')print(result)# <re.Match object; span=(0, 10), match='amnb你好b12b'>
result =match(r'a.+?b','amnb你好b12b开始三大')print(result)# <re.Match object; span=(0, 4), match='amnb'>
四、分支和分组
from re import*
1. 分支 - |
正则表达式1|正则表达式2 - 先让字符串和正则表达式1进行匹配,如果失败再和正则表达式2进行匹配
# 'abcMKJ'、'abc23'、'abcMHA'、 'abc34'result = fullmatch(r'abc[A-Z]{3}|abc\d{2}', 'abc23') print(result)
result = fullmatch(r'abc([A-Z]{3}|\d{2})','abc23')print(result)
2. 分组 - ()
1) 整体操作
# 'M12K34L45...'
result = fullmatch(r'([A-Z]\d{2})+','K34P23H34B23')print(result)
result = fullmatch(r'abc([A-Z]{3}|\d{2})','abc23')print(result)
2) 重复
在正则表达式中可以通过 ‘\N’ 来重复它前面第N个分组匹配到的结果 (N指的是任意一个正整数)
# 'mn123mn'、'kh234kh'、'ak109ak'
result = fullmatch(r'([a-z]{2})\d{3}\1','mn123mn')print(result)
result = fullmatch(r'([A-Z]{3})abc(\d{2})\1\2{3}','MKJabc12MKJ121212')print(result)# 案例: 写一个正则表达式判断指定字符串是否是一个合法的标准标签 # '<标签名>标签内容</标签名>'
result = fullmatch(r'<([a-zA-Z\d]+)>[^<>]*</\1>','<p>你好</p>')print(result)