正则表达式就是用来检测字符串是否满足某种规则的工具
例如:1.账号是手机号/邮箱/多少位由什么东西组成等...
2.脏话替换
1.正则语法
2.python对正则表达式的支持,提供了一个内置模块:re
from re import fullmatch
fullmatch(正则表达式,字符串):判断整个字符串是否符合前面正则表达式的规则
1.正则表达式里面的语法
符号 | 解释 | 例子 |
---|---|---|
. | 匹配任意一个字符 | b.t |
\w | 匹配字母数字下划线 | b\w |
\s | 匹配空白字符 | abc\s |
\d | 匹配一个数字字符 | abc\d |
\b | 检测是否是单词边界 | abc\b,123 |
^ | 检测一个字符串是否以正则表达是开头 | |
$ | 检测字符串是否以给定的正则表达式结尾 | |
\W | 匹配非数字、字母、下划线 | |
\S | 匹配非空白字符 | |
\D | 匹配非数字字符 | |
\B | 检测非单词边界 | |
[] | 匹配中括号中出现的任意字符,一个中括号只匹配一个字符 | |
[a-z][1-8] | 匹配a到z中或者1到8中的一个字符 | |
[^a-z] | 匹配不在字符集中的任意一个字符 |
3.re模块的方法
1.re.compile(正则表达式):将正则表达式转换成正则表达式对象,可以用来检测正则表达式是否错误
re_str ='\d+'
re_object = re.compile(re_str)
print(re_obect)
re_object.fullmatch('78') #转换成对象调用对应的方法
re.fullmatch(re_str,'78') #不转换成对象调用相应的方法
2.match(正则表达式,字符串):match判断字符串开头是否能够和正则表达式匹配,返回值是匹配结果
如果匹配成功返回匹配对象,否则返回None
re_str = r'abc\d{3}'
match1 = re.match(re_str,'abc123abc')
fullmatch(正则表达式,字符串):是判断整个字符串是否能够和正则表达式匹配,返回值是匹配结果
如果匹配成功返回匹配对象,否则返回None
a.匹配到的范围。匹配结果字符的下标范围:[起始下标:结束下标]----结束下标取不到
span(self,group)
start(self,group)
end(self,group)
re_str = r'abc\d{3}'
match1 = re.match(re_str,'abc123abc')
print(match1.span()) #获取下标的范围
print(match1.start()) #获取起点
print(match1.end()) #获取终点
注意:group参数是用来指定分组对应的相应的结果
re_str = r'(\d{3})\+([a-z]{2})'
match1 = re.match(re_str,'234+gj')
print(match1.span()) #(0,6)
print(match1.span(1)) #(0,3)
print(match1.span(2)) #(4,6)
print(match1.start(2)) #在匹配结果中获取第二个分组的起始下标
b.
print(match1.group()) #获取匹配结果对应的字符串
print(match1.group(1)) #获取匹配结果第一个分组对应的字符串
c.
print(match1.string) #获取被匹配的原字符串
3.search(正则表达式,字符串):在字符串中去查找第一个满足正则表达式要求的子串,如果找到了就返回匹配对象,找不到返回None
re_str = r'\d{3}'
match1 = re.search(re_str,'ab123b345')
print(match1.span()) #(2,5)
练习:使用search将一个字符串中所有的数字字符串全部找到
'工资是10000元,年龄是18岁,身高是:180,颜值是100分'
import re
re_str = r'[1-9]\d*'
str_1='工资是10000元,年龄是18岁,身高是:180,颜值是100分'
match1 = re.search(re_str,str_1)
while match1:
end = match1.end()
print(match1.group())
str_1 = str_1[end:]
match1 = re.search(re_str,str_1)
4.split(正则表达式,字符串)
按满足正则表达式的子串去切割字符串,返回值是列表,中文属于\w
str1 = 'ni,hao。hello,world'
re_str= r'[,。!!,]'
print(re.split(re_str,str1))
5.sub(正则表达式,替换字符串,被替换的字符串),返回值是先的字符串
word = '你丫是傻叉吗,我操你大写的,Fuck you'
re_str = r'傻叉|操|Fuck|'
new_word = re.sub(re_str,'*',word)
print(new_word)
6.findall(正则表达式,字符串)
获取字符串中所有满足正则表达式的子串
返回值是列表
注意:分组里的捕获在findall里是有效的
result = re.findall(r'\d([a-z]+)','anannHHDXN试试NNm')
4.正则表达式匹配验证
# 1).匹配任意字符
from re import fullmatch,search,findall
#匹配一个字符串,只有三位字符并且其中一个字符是任意字符
re_str = r'b.t'
result = fullmatch(re_str,'bat')
print(result)
#匹配一个字符串,只有两位位字符并且这两个字符是任意字符
re_str = r'..'
result = fullmatch(re_str,'ba')
print(result)
#匹配一个字符串,前三位分别是abc,最后一位是任意字符
re_str = r'abc.'
result = fullmatch(re_str,'abcl')
print(result)
# 2) \w匹配字母数字下划线(包括汉字)
#匹配一个字符串,前一位是a,后一位是字母数字下划线
re_str = r'a\w'
result = fullmatch(re_str,'a含')
print(result)
# 3) \s匹配空白字符(空白指的是空格,制表符和回车所有能产生空白的字符)
# 前三位是字母数字下划线,第四位是一个空白,最后一位是任意字符
re_str = r'\w\w\w\s.'
result = fullmatch(re_str,'abc\t%')
print(result)
# 4) \d匹配一个数字字符
# 前三位是数字,最后一位是任意字符
re_str = r'\d\d\d.'
result = fullmatch(re_str,'123G')
print(result)
# 5) \b检测是否是单词边界(单词的开头、结尾、单词和单词之间的标点空格等)
# \b不参与匹配,when\bwhere(错误的正则表达式),在匹配的时候\b不参与匹配,只是在匹配成功后再\b的位置
# 去检测\b的位置是否是边界
# 前四位是when第五位是空白,空白是where,并且第四位n的后面要是单词边界
# 注意:正则中遇到\b,匹配的时候先不管它,匹配成功后再回头看\b位置是否是单词边界
re_str = r'when\b\swhere'
result = fullmatch(re_str,'when where')
print(result)
# 6)^检测字符串是否以给定的正则表达式开头,^检测的时候先不匹配,先匹配正则,匹配成功后
# 去检测^的位置是否以给定的正则表达式开始,
re_str = r'^\d\d\w'
result =fullmatch(re_str,'12w')
result = search(re_str,'12c')
print(result)
# 7)$ $检测字符串是否以给定的正则表达式结束,不参与匹配
# 匹配一个字符串是否以一个w和数字结尾
re_str = r'w\d$'
result = search(re_str,'1234w1')
print(result)
# 8) \W 匹配非数字,字母,下划线的字符
re_str =r'\W\w'
result = fullmatch(re_str,'&1')
print(result)
# 9) \S匹配非空白字符
re_str = r'\S\w\w\w'
result = fullmatch(re_str,'ssss')
print(result)
# 10) \D匹配非数字字符
re_str = r'\D\d\d\d'
result = fullmatch(re_str,'x123')
print(result)
# 11) \B 检测非单词边界
re_str = r'when\Bwhere'
result = fullmatch(re_str,'whenwhere')
print(result)
# =======================匹配次数==========================
# 12)[] 匹配中括号中出现的任意字符
# 注意:一个中括号只匹配一个字符
# 匹配一个三位的字符串,第一位是a或者b或者c,后两位是数字
re_str = r'[abc+]\d\d'
result = fullmatch(re_str,'+67')
print(result)
# -在正则中的中括号里面的应用:如果将-放到两个字符中间,代表的额是谁到谁,
# 如果想要表示'-'符号本身就放在开头或者结尾
# 要求一个字符串中第一个是1-8中的一个,后面两位是小写字母
# [1-8]:代表的字符集是:12345678
# [-18]或者[18-]:代表的字符集是1,8,-
res_str = r'[1-8][a-z][a-z]'
result = fullmatch(res_str,'1ac')
print(result)
# 13)[^字符集]匹配不在[]字符集中的任意一个字符
# 匹配一个四位的字符串,第一位不是小写字母,后三位为任意字符
res_str = r'[^A-Z]s'
result = fullmatch(res_str,'zs')
print(result)
# 14)*匹配0次或者多次
# 匹配一个字符串,最后一位是b,b的前面有0个或者多个a
# a匹配0次或者多次,b匹配一次
re_str = r'a*b'
result = fullmatch(re_str,'aab')
print(result)
# 匹配0个或者多个数字
re_str = r'\d*'
# 15)+匹配一次或者多次,至少一次
re_str = r'[abc]+123'
result = fullmatch(re_str,'a123')
print(result)
# 判断一个字符串是否是无符号的正整数
re_str = r'[1-9]+\d*'
result = fullmatch(re_str,'100')
print(result)
# 注意:次数相关的操作都是约束的次数符号前的前一个字符
# 16)?匹配0次或者1次
re_str = r'1?'
result = fullmatch(re_str,'')
print(result)
# 判断一个字符串是否是整数(正整数负整数)
re_str = r'[+-]?[1-9]+\d*'
result = fullmatch(re_str,'-100')
print(result)
# 17){n} 匹配n次
re_str = r'\d{3}'
re_str = r'[a-zA-Z]{3}'
result = fullmatch(re_str,'abc')
print(result)
# 18) {m,} 至少匹配m次
re_str = r'\w{3,}'
result = fullmatch(re_str,'123355')
print(result)
# 19){,n}最多匹配n次
re_str = r'a{,4}b'
result = fullmatch(re_str,'b')
print(result)
# 20){m,n}至少匹配m次,最多匹配n次,要求n要大于m
re_str = r'\d{3,11}'
result =fullmatch(re_str,'110')
print(result)
# 练习:输入用户名和qq好
# 用户名必须由字母,数字或下划线构成长度在6-20个字符之间
# qq号是5-12的数字首位不能为零
# name_re =r'\w{6,20}'
# qq_re = r'[1-9]\d{4,11}'
# name = input('请输入用户名:')
# name = fullmatch(name_re,name)
# qq = input('请输入qq:')
# qq = fullmatch(qq_re,qq)
# if not name:
# print('用户名必须由字母,数字或下划线构成长度在6-20个字符之间')
# elif not qq:
# print('qq号是5-12的数字首位不能为零')
# else:
# print('输入正确')
# ==========================3.分之和分组
# 21) | 分之(相当于逻辑运算中的or)
re_str = r'\d{3}[a-zA-Z]{3}|\d{3}|\dabc'
print(fullmatch(re_str,'123abc'))
# 注意:\d{3}[a-zA-Z]{3}是分之的第一个条件,\d{3}是分之的第二个条件\dabc是分之的第三个条件
# 正则中的分之有短路操作,如果前面的条件满足要求了,后面的就不会执行
# 如果使用|去连接多个条件,前面的条件已经匹配出结果,那么久不会使用后面的
#
# 练习:写一个正则表达式,能够匹配出所有的数字(包括整数和小数)
re_str = r'[+-]?[1-9]\d*|[+-]?\d+[.]\d+'
result = fullmatch(re_str,'1')
print(result)
print(findall(re_str,'abc12.5hhh60,30.2kkk9nn0.12'))
# 注意:在匹配的时候如果有|那么把简单的放在前面
# 22)分组,可以通过加()来对正则条件进行分组
# 两位数字两位字母出现3次,
re_str = r'([a-zA-Z]{2}\d{2}){3}'
result = fullmatch(re_str,'ab12ab12ab12')
print(result)
# 匹配一个字符串,按照一个数字一个字母的规律出现一次或者多次
re_str = r'(\d[a-zA-Z])+'
# b.重复
# 可以通过\数字来重复匹配前面的分组中匹配的结果。数字的值代表前面的第几个分组
re_str = r'(\d{2}[A-Z])(=%)\1\2'
print(fullmatch(re_str,'23B=%23B=%'))
# c.捕获
# 只有在查找的时候有效findall,按照完整的正则表达式去匹配,但是取结果的时候
# 只捕获括号中的内容
re_str = r'a(\d{3})b'
print(findall(re_str,'a786b'))
# 23)正则里面的转义字符:正则表达式中的转义字母没有任何关系。在python中
# 字符串的前面加r阻止的是字符的转义,不能那个阻止正则表达式的转义
# 注意:
# a.'-'只有在中括号中的两个字符之间才有特殊的意义
# b. ()在正则表达式中也需要转义
# c.[]也需要转义
# d.$,^,+,?,*,|都需要转义
# e.如果特殊符号是放在中括号中作为字符集的内容,那么除了-号在两个字符之间以外其他
# 的都不需要转义
# f.\不管在哪儿都需要转义,^放在中括号的最前面需要转义
# 在正则表达式中,可以通过在有特殊意义的符号前加'\'来表示符号本身
# re_str = r'a\+' 这个需要加
# re_str = r'\+a' 这个也需要加
# re_str = r'\\w' 表示匹配\w
网友评论