print('==========匹配符号=========')
from re import fullmatch,search,findall,finditer
fullmatch(正则表达式,字符串) -- 查看字符串与正则表达式是否匹配,如果不匹配返回None
正则表达式:r'正则语法'
1)表示匹配一个字符串有三个字符,分别是a,b,c
str1 = r'abc'
result = fullmatch(str1, 'abc')
print(result)
2). -- 点表示匹配任意字符
str2 = r'abc..123'
result = fullmatch(str2,'abc. 123')
print(result)
3)\w -- 匹配一个数字,字母或者下划线(只针对AscII码表来说)
一个\w只能匹配一个字符
str3 = r'\wabc'
result = fullmatch(str3, '侯abc') #中文不在ASCII码表里面
print(result)
4)\d - 匹配任意一个数字字符
str4 = r'\d\dabc'
str5 = r'\d\d...'
result = fullmatch(str4, '12abc')
result1 = fullmatch(str5, '12沙雕王')
print(result1)
5)\s - 匹配任意一个空白字符
'''
空白字符:空格符,换行符,制表符
'''
str1 = r'how\sare'
result2 = fullmatch(str1, 'how are')
print(result2)
6)\大写字母
'''
\D - 匹配除了数字字符以外的任意字符
\S - 匹配一个非空字符
'''
7)[字符集] -- 匹配字符集中出现的任意一个字符
注意:一个中括号只能匹配一个字符
a. [多个字符] - 例如:[abc] 匹配abc中任意一个字符a或b或c
b. [1-9] - 表示可匹配的字符1到9(递增表示编码值递增)
c. [\u4e00-\u9fa5] - 匹配任意一个中文字符
str1 = r'[a-zA-Z0-9]_'
result = fullmatch(str1, 'aA1_')
print(result)
8)[^字符集] - 匹配不在字符集中的任意一个字符
str6 = r'[^0-9]'
print(fullmatch(str6, 'i'))
print('===========检测符号===========')
注意:所有检测符号都不会影响字符串长度
1)\b - 检查是否是单词边界
单词边界:能够将两个单词隔开并且不会产生歧义的任意符号:空白字符,标点符号,字符串开头和字符串结尾等等
匹配规则:先去掉\b对字符串进行匹配,如果匹配成功再检查\b所在的位置是否是单词边界
str2 = r'how,are\b'
print(fullmatch(str2, 'how,are'))
str4 = r'\b[\u4e00-\u9fa5][\u4e00-\u9fa5]\b'
print(fullmatch(str4,'哈哈'))
print(search(r'\b\d\d\b', 'gj76gj 98 ')) -- #利用边界字符\b 表示取到的数字是独立的 (search表示从很长的字符串中找到符合条件的字符)
2)^ -- 表示检查^所在的位置是否是字符串开头(与search和findall用的多)
'''
注意:这儿的^是在[]外面的,也是正则字符的最前面表示规定以什么开头,就把开头符号条件的值输出
'''
str1 = r'^\d\d\d'
print(fullmatch(str1, '345'))
print(search(str1, '123hjh234'))
print(findall(str1, '333hjk232'))
3)所在的位置是否是字符串结尾
控制次数的符号:字符符号(符号表示要字符出现的次数)
1.* -- 匹配0次或多次
'''
123a* -- 表示123后面的a出现0次或多次
123\d* -- 表示123后面出现0个或者多个任意数字字符
123[mnxy91]* -- 表示可匹配123,123mm,123nn,123mnxx,123mmnxxyy
print(fullmatch(r'123[mnxy91]*', '123mmnnxxyy9911'))
'''
str3 = r'1[2-8]\d*'
print(fullmatch(str3, '13765577103'))
2.+ -- 匹配一次或多次(在谁后面添加+谁可重复1次或多次)
'''
123a+ -- 123a,123aa,123aaa,.....
'''
3.? -- 匹配0次或1次(加在谁后面谁可匹配0或多次)
'''
-?123 - 只有123/-123可以匹配
'''
4. {}(放在谁后面匹配谁几次)
'''
1){N} - 匹配N次
a{3} - 匹配3个a
\d{3} -- 匹配3个任意数字
2){M,N} -- 匹配M到N次(匹配至少M次,最多N次)
'''
匹配电话号码
str5 = r'1[3,9]\d{9}'
匹配密码:要求6-12位的字母或者数字
str3 = r'[a-zA-Z0-9]{6,12}'
print(fullmatch(str3, '36gh28'))
贪婪和非贪婪
在匹配次数不确定的时候,会出现贪婪和非贪婪(默认情况都是贪婪的)
'''
什么是贪婪:在能够'匹配成功'的前提下,匹配次数尽可能多
非贪婪:在能够匹配成功的前提下,匹配次数尽可能少
'''
贪婪:
str1 = r'a.+b'
print(search(str1,'hjkha==2-32'))
print(search(r'a\d{3,5}', 'hjha34b456b6')) -- 由于贪婪所以取最多a34b456b
非贪婪
str1 = r'a.+?b'
print(search(str1,'hjkha==2-32'))
print(search(r'a\d{3,5}', 'hjha34b456b6')) -- 非贪婪取的是a34b
print('====================分之================')
1. |
'''
正则1|正则2 -- 先让正则1去匹配,如果匹配成功就成功匹配失败在让正则2去
(正则1和正则2 中只要有一个匹配成功即可)
'''
str2 = r'\d{2,5}|[A-Z0-9]abc'
print(fullmatch(str2, '234'))
print('============分组=============')
1.() -- 将括号里面的内容作为一个整体
'''
1)整体操作
r'(\d\d|[A-Z]{2})abc' - 匹配一个字符串后面是abc,前面是两个数字或者大写字母
r'([a-z]\d){3}' -- a8j1k9
2)分组
a.分组截取: 方便分段分情况取不同的匹配结果
str11 = r'(\d{3})[a-z]{3}'
print(findall(str11, '382dg234hljkl123hjk'))
b.分组重复:在正则中分组的后面用\X来重复前面的分组(x是数字几就重复几次)
'''
strr1 = r'(\d{3})[a-z]{3}\1'
print(fullmatch(strr1, '123bbb123'))
print('===========转义字符============')
1. 加\
'''
在正则中有特殊功能和特殊意义的符合前面加入 \ 让这个符合的特殊功能和意义消失
'''
2.加[]
'''
在[]中有特殊意义的符号:^ 放在最开头,- 在两个字符之间
其他字符包括:.+?*$,这个单独的符号在[]中都表示这个符号本身
'''
print('========re模块========')
import re
re模块是python提供的专门针对正则表达式应用的相关函数
1.compile(正则表达式) - 将正则表达式转换成正则对象
2.fullmatch(正则表达式,字符串) - 将正则表达式与字符串完全匹配
match(正则表达式,字符串) -- 只匹配字符串开头
注意:以上二者匹配成功返回匹配对象,匹配失败返回None
1)匹配对象
a.获取匹配到的字符串
'''
匹配对象.group() -- 获取整个正则表达式匹配到的字符串,结果的字符串
匹配对象.group(N) -- 获取整个正则表达式中第N个分组匹配到的字符串
'''
result = fullmatch(r'(\d{3})=([a-z]{3})','234=ana')
print(result.group())
print(result.group(1))
b.获取匹配到的字符串在原字符串中的位置信息
'''
匹配对象.span() -- 返回 匹配结果在原字符串中的下标范围:[开始下标,结束下标]
匹配对象.span() -- 返回第N个分组匹配到的结果在原字符串中的范围
'''
c.获取原字符串
'''
匹配对象.string
'''
3.查找
'''
1)search(正则表达式,字符串) -- 在正则表达式中查到第一个满足正则表达式的子串,找到了结果就是匹配对象,否则就是None
2)findall(正则表达式,字符串) -- 获取字符串中所有满足正则表达式的子串,返回值是一个列表
注意:如果正则表达式中有分组,列表中的匹配结果只会取分组匹配到的内容
3)finditer(正则表达式,字符串) -- 获取字符串中所有满足正则表达式的子串,返回值是一个迭代器,元素是匹配对象
'''
result = search(r'(\d{3})([a-z]{3})','gjkj123hjk43kj546hkhk121hjj')
print(result.group())
result = finditer(r'(\d{3})([a-z]{3})','gjkj123hjk43kj546hkhk121hjj')
print(result)
list1 = []
list2 = []
list3 = []
for x in result:
list1.append(x.group())
list2.append(x.group(1))
list3.append(x.group(2))
print(list1)
print(list2)
print(list3)
result = search(r'^\d{3}', '123jgk456')
print(result)
4.切割
'''
split(正则表达式,字符串) -- 将字符串中满足正则表达式的子串作为切割点对字符串进行切割,返回一个字符串列表
'''
5.替换
'''
sub(正则表达式,字符串1,字符串2) -- 将字符串2 中所有满足正则表达式的子串都替换成字符串1,返回一个字符串
'''