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'].

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

      

  • 相关阅读:
    MySQL-事务相关知识
    Linux脚本-自动ping网址列表
    洛谷 P2453 [SDOI2006]最短距离
    洛谷 P2915 [USACO08NOV]Mixed Up Cows G
    洛谷 P2473 [SCOI2008] 奖励关
    洛谷 P3391 【模板】文艺平衡树
    洛谷 P4146 序列终结者
    洛谷 P1486 [NOI2004] 郁闷的出纳员
    洛谷 P2596 [ZJOI2006]书架
    性能测试工具Jmeter02-安装配置
  • 原文地址:https://www.cnblogs.com/wangtaobiu/p/10674229.html
Copyright © 2011-2022 走看看