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

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

作者: rzlong | 来源:发表于2018-09-11 19:00 被阅读0次

    正则表达式

    python关于正则的支持
    • 提供内置模块re
    • fullmatch(正则表达式, 字符串) - 判断字符串是否正则表达式的规则
    具体内容
    表示方法 解析
    .(点) 匹配任意一个字符
    \w 匹配一个字母a-zA-Z、数字0-9或下划线_
    \s 匹配一个空白字符(空格、制表符\t、换行符\r和回车\n)
    \d 匹配一个数字字符0-9
    \b 检测是否是单词边界(单词的开始、结尾、单词和单词之间的字符、空白)
    ^ 检测字符串是否以指定的正则表达式开头
    $ 检测字符串是否以指定的正则表达式结束
    \W 匹配一个非字母、数字或下划线的字符
    \S 匹配一个非空白字符
    \D 匹配一个非数字字符
    \B 检测一个非单词边界
    匹配次数 解析**
    [] 匹配括号中出现的任意字符,一个中括号中匹配一个字符
    -(负号) 在正则表达式的中括号里应用,两边的字符是对应的unicode码(含ASCII码)对应的字符
    [^字符集] 匹配不再[]中出现的任意一个字符
    * 可以匹配0次或多次字符(其前面的字符)
    + 可以匹配1次或多次字符(前面)
    ? 可以匹配0次或1次
    {N} 匹配N次字符
    {N,} 最少匹配N次
    {,N} 最多匹配N次
    {M,N} 可匹配最少M次,最多N次
    注意 次数相关的操作,都是约束次数符号的前一个的字符

    分支和分组

    • | 分支(相当于逻辑运算的or)
    a3str = r'[a-zA-Z]{3}|\d{3}' #三个字母或数字
    print(fullmatch(a3str,'123'))
    print(fullmatch(a3str,'abc'))
    a3str = r'\d{3}[a-z]{3}|[A-Z]{6}' #|左右分成两部分,即123abc或ASDQWE均成立
    # 含分支操作时,只要有一个符合条件就不再使用后续的其他条件
    a4str = 'abc12.5hhh60,30.2kkk9nn0.12'
    print(findall('\d+[.]\d+|[1-9]\d+',a4str))
    
    result;
    <_sre.SRE_Match object; span=(0, 3), match='123'>
    <_sre.SRE_Match object; span=(0, 3), match='abc'>
    ['12.5', '60', '30.2', '0.12']
    
    
    • 分组

    1.通过()对正则表达式进行分组操作

    a4str = r'([a-z]{2}\d{2}){3}' #两个字母两个数字连续出现3次
    print(fullmatch(a4str,'ad13ad12as32'))
    
    result:
    <_sre.SRE_Match object; span=(0, 12), match='ad13ad12as32'>
    

    2.重复,可以通过 \数字 来重复一次前面括号中匹配的结果,数字的值代表前面的第几个分组

    a4str = r'(\d{2}[a-z])(\d{3})\1'
    print(fullmatch(a4str,'12q55512q'))
    
    result:
    <_sre.SRE_Match object; span=(0, 9), match='12q55512q'>
    

    3.捕获,按照完整的正则表达式去匹配,去捕获()中的内容。只有在findall中有效

    a4str = r'a(\d{3})b'
    print(findall(a4str,'da124bob341a'))
    
    result:
    ['124']
    

    正则表达式的转义

    • 正则表达式的转义和字符串的转义没有任何关系,在Python中字符串前加r阻止的是字符串的转义,不能阻止正则表达式的转义
    • 在正则表达式中,可以通过在有特殊意义的符号前加\来表示符号本身
    如: \+ \- \. \* \? \\(\本身) \( \) \^ \$ \|
    
    注意: 
    a. - 只有在中括号里的两个字符之间才有特殊的意义
    b. 如果特殊符号放到[]作为字符集的内容,那么除了-在两个字符间以外其他不需要转义
    c. \ 不管放在何处都需要转义, ^放在中括号里的最前面需要转义(转义后就是单纯的字符)
    
    • 例子
    a2tr = r'[abc\\]{3}'
    print(fullmatch(a2tr,'\\ac'))
    print(fullmatch(a2tr,r'\ac'))
    
    result:(\\ 与 前r效果一样)
    <_sre.SRE_Match object; span=(0, 3), match='\\ac'>
    <_sre.SRE_Match object; span=(0, 3), match='\\ac'>
    

    re 模块

    • compile(正则表达式) - 将正则表达式转换成正则表达式对象
    re_str = r'\d+'
    re_object = re.compile(re_str)
    print(re_object,type(re_object))
    
    # 不转换成正则表达式对象,调用函数
    re.fullmatch(re_str,'123asd')
    # 转换成正则表达式,调用函数
    re_object.fullmatch('123asd')
    
    result:
    re.compile('\\d+') <class '_sre.SRE_Pattern'>
    
    • match(正则表达式, 字符串)--只判断字符串的开头是否能够和正则表达式匹配
    • fullmatch(正则表达式, 字符串)--判断整个字符串是否能够和正则表达式匹配
    # 返回值都是匹配结果,如果匹配成功返回匹配对象,否则返回None
    
    
    re_str = r'abc\d{3}'
    match = re.match(re_str,'abc123456')
    match2 = re.fullmatch(re_str,'abc123')
    # a.匹配到的范围。匹配结果字符单位下标范围
    print(match.span(),match2.span())
    #获取起点和终点
    print(match.start(),match.end())
    # 正则表达式有分组时,span()函数中的group参数指定特定分组相应的结果
    re_str = r'(\d{3})\+([a-z]{3})'
    match1 = re.match(re_str,'123+qwe001')
    print(match1,match1.span(),match1.span(1),match1.span(2))
    # b.获取匹配结果对应的字符串
    print(match1.group(),match1.group(1),match1.group(2))
    
    # c.获取被匹配的原字符串
    print(match1.string)
    
    result:
    (0, 6) (0, 6)
    0 6
    <_sre.SRE_Match object; span=(0, 7), match='123+qwe'> (0, 7) (0, 3) (4, 7)
    123+qwe 123 qwe
    123+qwe001
    
    • search(正则表达式, 字符串)-在字符串中查找第一个满足正则表达式的子串,若找到返回匹配对象,否则返回None
    search1 = re.search(r'\d+Zz','hello my son,5Zz')
    print(search1)
    
    result:
    <_sre.SRE_Match object; span=(13, 16), match='5Zz'>
    
    • split(正则表达式, 字符串) - 按满足正则表达式的子串去切割字符串,返回列表
    str2 = '锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。'
    result = re.split(r'[,,。.]',str2)
    result2 = re.split(r'\W',str2)
    print(result[:-1])
    print(result2)#中文的输入也在\w以内
    
    result:
    ['锄禾日当午', '汗滴禾下土', '谁知盘中餐', '粒粒皆辛苦']
    ['锄禾日当午', '汗滴禾下土', '谁知盘中餐', '粒粒皆辛苦', '']
    
    • sub(正则表达式,替换字符串,被替换的字符串)
    word = '你丫是傻逼吗?我操死你大爷。挂机死全家'
    result3 = re.sub(r'傻逼|操|死|挂机','?',word)
    print(result3)
    
    result:
    你丫是?吗?我??你大爷。??全家
    
    • findall(正则表达式, 字符串) - 获取字符串中所有满足正则表达式的子串,返回值是列表。注意: 分组中的捕获效果在findall中有效
    result4 = re.findall(r'\d([a-z]+)','对滴2abc光明0iop')
    print(result4)
    
    result:
    ['abc', 'iop']
    

    相关文章

      网友评论

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

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