2018-09-11-day17正则表达式

正则表达式就是用来检测字符串是否满足某种规则的工具
例如: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


推荐阅读更多精彩内容

  • 正则表达式 正则表达式就是用来检测字符串是否满足某种规则的工具例如:匹配手机号、邮箱、脏话检测等 1、单字符 py...
    Deathfeeling阅读 174评论 2 1
  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 21,064评论 4 45
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 3,537评论 0 13
  • 落幕夕阳,执笔墨香,淡淡幽意清凉。 怀古望,砯崖回畅,嫩茶香。 此之从容客之扬长,洒脱人之挥忘。 陌途他乡,但寻解...
    木决阅读 231评论 4 11
  • 再平庸的人,身上都蕴藏着钻石, “要想找到这颗钻石, 请先思考你有什么样的兴趣爱好。 不要因为某项兴趣看来太过普通...
    党瑞红阅读 49评论 0 0
  • 我给自己的评价是:从小蔫坏,长大晚熟。情商低下,逆商为零。 据说情商低下的最典型表现就是容易冲亲近的人发火。好吧,...
    杨戬阅读 230评论 9 7
  • 我和她打小儿就认识,一起玩到大,小时候的我特别咬尖儿,看谁都不服,当然包括她。而她总是一副面无表情不吭声的脸,说什...
    王哈哈_0219阅读 136评论 0 2
  • 许是太久,失眠的夜才会想你! 许是太劳累,休息后才会回忆起! 许是爱可贵,失败后一直买醉! 只愿他乡、故土、风里雨...
    黄小邪师傅阅读 106评论 0 1