day17总结

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,返回一个字符串
'''

你可能感兴趣的:(day17总结)