python re模块,findall 是否带有括号返回结果不一致

转载至:https://www.cnblogs.com/one-lightyear/p/6814833.html,感谢作者:一光年太远

 

今天写代码,在写到正则的时候遇到了一个坑,这个坑是re模块下的findall()函数。

下面我将结合代码,记录一下

import re

string="abcdefg  acbdgef  abcdgfe  cadbgfe"

#带括号与不带括号的区别
#不带括号
regex1=re.compile("(\w+)\s+\w+")
print(regex1.findall(string))
#输出:['abcdefg', 'abcdgfe']
#解释:\s+代表空格,只返回括号内的匹配项,执行完第一次匹配,已经进行到第二个空格的前面位置,接下来的匹配从这个位置起始;

regex2=re.compile("\w+\s+\w+")
print(regex2.findall(string))
#输出:['abcdefg  acbdgef', 'abcdgfe  cadbgfe']
#解释:\s+代表空格,返回整个正则式的匹配项;执行完第一次匹配,已经进行到第二个空格的前面位置,接下来的匹配从这个位置起始;

regex3=re.compile("((\w+)\s+\w+)")
print(regex.findall(string))
#输出:[('abcdefg  acbdgef', 'abcdefg'), ('abcdgfe  cadbgfe', 'abcdgfe')]
#解释:\s+代表空格,返回两次括号的匹配项;执行完第一次匹配,已经进行到第二个空格的前面位置,接下来的匹配从这个位置起始;


#结论:
#findall()返回的是括号所匹配到的结果(如regex1);
#如果没有括号就返回就返回整条语句所匹配到的结果(如regex2)
#多个括号就会返回多个括号分别匹配到的结果(如regex3);

第一个 regex 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。

第二个 regex 中不带有括号,其输出的内容就是整个表达式所匹配到的内容。

第三个 regex 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple 

 

结论:findall()返回的是括号所匹配到的结果(如regex1),多个括号就会返回多个括号分别匹配到的结果(如regex3),如果没有括号就返回就返回整条语句所匹配到的结果(如regex2)。所以在提取数据的时候就需要注意这个坑。

   实际上是由其并不是python特有的,这是 正则 所特有的 , 任何一门高级语言使用正则都满足这个特点:有括号时只能匹配到括号中的内容,没有括号【相当于在最外层增加了一个括号】。在正则里面 “()” 代表的是分组的意思,一个括号代表一个分组,你只能匹配到"()"中的内容

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值