Python正则表达式中使用findall函数遇到括号嵌套的小坑

1.findall函数

我们都知道括号在正则表达式中起到了分类的作用,但当定义好一个自己的字符匹配模式(含有括号)后,使用findall()函数会遇到一点小坑。

具体来说就是:
在这里插入图片描述

可以发现是否将整个正则表达式用括号括起来会影响findall的返回结果

  • 如果有括号括,则返回元组的第0项是匹配到的整个字符串’abcde’
  • 如果没有,则返回元组的第0项就是第一对括号’bc’

并且当存在多层括号嵌套时,各组的排序遵循从左到右,从外到内的原则。即对于正则表达式(a(bc)((d)(e))),'abcde’是第0组,'bc’是第1组,'de’是第2组,'d’是第3组,而’e’则是第4组。

2.findall与search

读到这边你可能会有疑惑,这不是很合理的设定吗,哪里“坑了”?这就不得不提高正则表达式中经常会用到的search函数,如果你定义了上文中那个没有用括号整个括起来的正则表达式:

tt = re.compile(r'a(bc)((d)(e))')

再调用search函数,就会发现问题所在:
在这里插入图片描述

我们发现即使没有括号括起整个正则表达式,search(‘abcde’).group(0)返回的仍然是整个字符串,group(1)才是定义好的“第一组”,这与findall函数所得到的结果是不同的,在实际使用中必须要区分search函数与findall函数的区别!!!

注:groups()函数总是返回整个字符串,注意区分group()与groups()

如果定义的下面这种呢:

tt = re.compile(r'(a(bc)((d)(e)))')

你会发现自己多此一举了,group(0)与group(1)都会返回整个字符串:
在这里插入图片描述

3.总结

总结一下,即:

  • 有几对括号,findall函数就分几组,排列顺序遵循从左到右,由外到内,想要把整个字符串作为元组的一项,就给整个正则表达式套括号
  • search返回对象的group(0)总是整个字符串,然后才是相应的组,所以不必多次一举给整个正则表达式套括号。

猜你喜欢

转载自blog.csdn.net/qq_32925781/article/details/83315468