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)总是整个字符串,然后才是相应的组,所以不必多次一举给整个正则表达式套括号。