zoukankan      html  css  js  c++  java
  • re模块中的非贪婪匹配

        python的re模块中有贪婪匹配和非贪婪匹配之分,当使用*时会匹配零个或多个,使用+时会匹配一个或多个.当使用?在前边特殊符号前时会进行非贪婪匹配,匹配零个或者一个,今天主要讨论非贪婪匹配中存在的坑.

    import re
    
    res = re.findall('a?','aaa')
    print(res)
    
    #['a', 'a', 'a', '']
    
    res1 = re.findall('pa?','paaa')
    print(res1)
    
    #['pa']
    
    res2 = re.findall('.?','aaaa')
    print(res2)
    
    #['a', 'a', 'a', 'a', '']

      从上边例子中可以看出,当带有'?'的部分单独处于正则开头并且后边没有其它匹配条件时,匹配结果会多匹配一次,所以在res和res2中会多匹配一个空格;而当'?'部分在正则的中间或者尾部时,则不会出现多一次的情况,所以在res1中结果是'pa'.此时有人会问为什么res会匹配出空格,而res1在没匹配到时候没有空格?看下边的例子:

    import re
    
    ret = re.findall('paa?','papaaa')
    print(ret)
    #['pa', 'paa']
    
    ret1 = re.findall('(paa)?','papaaa')
    print(ret1)
    
    #['', '', 'paa', '', '']
    
    ret2 = re.findall('a(?:paa)?','apapaaa')
    print(ret2)
    
    #['a', 'apaa', 'a']
    

      上边例子中可以看出,只有当正则表达式只有一个单独的分组或者元字符时,加上'?'如果匹配不到才会出现空格,而且在ret1中可以看出,多匹配了一次空格.当正则是一串字符时,匹配出的就没有空字符,所以ret结果为['pa', 'paa'].

      综上所述:当正则表达式中是以带'?'的部分开头并且没有其它匹配内容时,匹配不到会出现空字符,并且会多匹配一次;而当使用两个'?'时,结果肯定是匹配零个;如果正则是一个分组(即一个单独的整体时)才会匹配出空字符.

      

  • 相关阅读:
    iOS 面试题搜集
    iOS 常用第三方类库、完整APP示例
    iOS 键盘遮挡输入 解决办法
    iOS UIColor RGB HEX
    iOS APP性能优化
    iOS Swift 数组 交换元素的两种方法
    iOS CoreData primitive accessor
    iOS Start developing ios apps (OC) pdf
    iOS 传值方式
    iOS IB_DESIGNABLE IBInspectable @IBDesignable @IBInspectable 加速UI开发
  • 原文地址:https://www.cnblogs.com/wangtaobiu/p/10674229.html
Copyright © 2011-2022 走看看