wangtaobiu

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

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

  

分类:

技术点:

相关文章:

  • 2021-11-29
  • 2021-11-29
  • 2021-07-20
  • 2021-12-12
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
猜你喜欢
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-11-29
  • 2021-09-25
相关资源
相似解决方案