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)总是整个字符串,然后才是相应的组,所以不必多次一举给整个正则表达式套括号。
  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值