from re import fullmatch
'''
a+ 至少一个a ,
\d+ 至少一个数字字符
'''
result = fullmatch(r'1a+2','1aaaaaaaa2') #1和2中间至少要有一个a
print(result)
result = fullmatch(r'1\d+2','1454454545452') #1和2之间至少要有一个数字字符
print(result)
result = fullmatch(r'1[A-Z]+2','1DFER2')
print(result)
result = fullmatch(r'1a*2','12') #和 + 唯一区别是, 可以一个元素都没有
print(result) # 1和2之间可以任意个a,可以没有a
result = fullmatch(r'1[\u4e00-\u9fa5]?2','1吗2') #1 和2之间0或1个中文字符
print(result)
{ N } N次
{ M,N } M到N次
{M,}. 至少M次
{ ,N } 最次
result = fullmatch(r'1[3-9]\d{3}','13111') #\d任意数字字符只能三次
print(result)
result = fullmatch(r'1[3-9]\d{3,5}','1311111')#\d任意数字字符可以出现3次到5次(3,5也行)
print(result)
result = fullmatch(r'1[3-9]\d{3,}','13111') # 最少3次
print(result)
result = fullmatch(r'1[3-9]\d{,3}','1311') #最多三次,这里是两次
print(result)
result = match(r'a[a-z]+?b','amnbdfdfbdfdfdfbd')
print(result)
#这样只会选择amnb, +? 是取最小的满足匹配规则的
result = match(r'\d{3}','123的粉红色答复哈水电费哈水淀粉')
print(result)
#只匹配开头123,后面多少都可以
# 注意
result = match(r'a[a-z]+b','amnbdfdfbdfdfdfbd')
print(result)
#首先默认贪婪, 这里是a和b中间可以任意a-z字母, 但是后面这种有很多选择,amnb可以
#amnbdfdfb可以
result = fullmatch(r'(\d\d[a-z]{3}){3}','99qwe44ewq35oer')
print(result)
#( )括号括起来的一部分是一个整体,两个数据+三个字母 重复三次
result = fullmatch(r'(\d[A-Z])+abc','2W8Jabc')
print(result)
# 这里是 任意数字和任意大写字母的一个组合,可以重复多次, 最后加上 abc
result = fullmatch(r'(\d{3})([A-Z]{2})=\2\1{3}','123AD=AD123123123')
print(result)
'''
先任意数字字符三个,选择123
然后任意一个大写字母,选择两个 AD
再来一个 =
再\2 第二个分组也就是 选个字母 执行两次 ,再来一个AD
再是\1{3} , 就是第一个分组, \d{3} 执行3次 ,也就是123 再写3次
'''
1.自动捕获:findall 函数支持自动捕获(findall在获取匹配结果的时候自动获取分组匹配到的结果)
findall(正则表达式, 字符串) --- 获取字符串所有符合正则表达式所描述的规则子串
result = findall(r'\d{3}','123AD=AD1231dfer231ddd23')
print(result) #找三个连续数字字符
#['123', '123', '231']
# 提取 前面要有中文字符的连续三个数字
result = findall(r'[\u4e00-\u9fa5](\d{3})','的123AD=AD大方123dfer的f231ddd23')
print(result) # 将三个连续字符这个要求用 () 分组 框起来,就只获取分组中内容
#['123', '123']
2.手动捕获: fullmatch 、match、search、finditer的结果都支持手动捕获
result = match(r'([\u4e00-\u9fa5])(\d{3})','的123AD=AD大方123dfer的f231ddd23')
print(result.group(1),result.group(2),result.group())
# 的 123 的123
'''
result.group() 是输出你所要求的部分, 这里就是汉字+三个数字。汉字是第一个分组(括号括起来的)
result.group(1) 是你要求的部分且用分组符号括起来的, 就是汉字
result.group(2) 第二部分,就是 三个连续数字
'''
result = fullmatch(r'\d{3}abc|[A-Z]{3}abc','QWEabc')
print(result)
# 这是三个数字+abc 或 三个大写字母+abc都可
result = fullmatch(r'(\d{3}|[A-Z]{3})abc','123abc')
print(result)
# 用 分组() 框起来的部分,+abc , 分组中的 | 前后满足其一即可,最后是abc
result = fullmatch(r'\d\d\.\d\d','23.55')
print(result)
# 想让一个小数进行匹配, 因为 . 在正则中是匹配任意字符功能,加个 \ ,让其功能消失
result = fullmatch(r'\d\d[.]\d\d','23.45')
print(result)
result = fullmatch(r'\(\d{3}\)','(183)')
print(result)
# 放在[] 里 符号失去功能
result = fullmatch(r'[.+?*(){}]abc','{abc')
print(result)
result = fullmatch(r'\d{3}\s\babc','342 abc')
print(result)
#\s 在这是空格, \b 检测a前面是否是单词边界
result = findall(r'\d{3}','是的343非454非地方934非地方地方ffdf343方法')
print(result)
#['343', '454', '934', '343']
result = finditer(r'\d{3}','是的343非454非地方934非地方地方ffdf343方法')
print(list(result))
'''
[,
,
,
'''
result = split(r'\d{3}','是的343非454非地方934非地方地方ffdf343方法')
print(result)
result = split(r'\d{3}','是的343非454非地方934非地方地方ffdf343方法',3)
print(result)
sub (正则表达式,字符串1,字符串2) 将字符串2中所有满足正则的子串都换成字符串1
result = sub(r'\d{3}','+','是的343非454非地方934非地方地方ffdf343方法')
print(result)
# 把连续三个数字换成 +
#是的+非+非地方+非地方地方ffdf+方法
result = sub(r'\d{3}','+','是的343非454非地方934非地方地方ffdf343方法',2)
print(result)
# 只换前两个
#是的+非+非地方934非地方地方ffdf343方法
r'(?i)正则表达式'
result = fullmatch(r'(?i)[a-z]\d{3}','R345')
print(result)
给正则函数 flags = I
result = fullmatch(r'[a-z]\d{3}','R345',flags= I)
print(result)
result = fullmatch(r'(?s)a.b','a\nb')
print(result)
result = fullmatch(r'a.b','a\nb',flags=S)
print(result)
# 用(?si)
result = fullmatch(r'(?si)a.b','A\nb')
print(result)
# flags 参数赋值 S | I
result = fullmatch(r'a.b','A\nb',flags=S|I)
print(result)
# flags参数给s 成单行匹配, 在前面(?i)忽略大小写
result = fullmatch(r'(?i)a.b','A\nb',flags=S)
print(result)