美文网首页
2018-09-11-day17正则表达式

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

作者: oxd001 | 来源:发表于2018-09-11 17:26 被阅读0次

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

    相关文章

      网友评论

          本文标题:2018-09-11-day17正则表达式

          本文链接:https://www.haomeiwen.com/subject/qsgugftx.html