python re的findall和finditer的区别详解

python正则模块re中findall和finditer两者相似,但却有很大区别。 

两者都可以获取所有的匹配结果,这和search方法有着很大的区别,同时不同的是一个返回list,一个返回一个MatchObject类型的iterator

假设我们有这样的数据:其中数字代表电话号,xx代表邮箱类型

content = \'\'\'email:12345678@163.com
email:2345678@163.com
email:345678@163.com
\'\'\' 

需求:(正则没有分组)提取所有的邮箱信息

result_finditer = re.finditer(r\"\\d+@\\w+.com\", content)
#由于返回的为MatchObject的iterator,所以我们需要迭代并通过MatchObject的方法输出
for i in result_finditer :
  print i.group()

result_findall = re.findall(r\"\\d+@\\w+.com\", content)
#返回一个[] 直接输出or或者循环输出
print result_findall
for i in result_findall :
  print i 

需求:(正则有分组)提取出来所有的电话号码和邮箱类型

result_finditer = re.finditer(r\"(\\d+)@(\\w+).com\", content)
#正则有两个分组,我们需要分别获取分区,分组从0开始,group方法不传递索引默认为0,代表了整个正则的匹配结果
for i in result_finditer :
  phone_no = i.group(1)
  email_type = i.group(2)

result_findall = re.findall(r\"(\\d+)@(\\w+).com\", content)
#此时返回的虽然为[],但不是简单的[],而是一个tuple类型的list 
#如:[(\'12345678\', \'163\'), (\'2345678\', \'163\'), (\'345678\', \'163\')]
for i in result_findall :
  phone_no = i[0]
  email_type = i[1] 

命名分组和非命名分组的情况是一样的。

findall注意点:

1.当正则没有分组是返回的就是正则的匹配

re.findall(r\"\\d+@\\w+.com\", content)
[\'2345678@163.com\', \'2345678@163.com\', \'345678@163.com\'] 

2.有一个分组返回的是分组的匹配而不是整个正则的匹配

re.findall(r\"(\\d+)@\\w+.com\", content)
[\'2345678\', \'2345678\', \'345678\'] 

3.多个分组时将分组装到tuple中 返回

re.findall(r\"(\\d+)@(\\w+).com\", content)
[(\'2345678\', \'163\'), (\'2345678\', \'163\'), (\'345678\', \'163\')] 

因此假如我们需要拿到整个正则和每个分组的匹配,使用findall我们需要将整个正则作为一个分组

re.findall(r\"((\\d+)@(\\w+).com)\", content)
[(\'2345678@163.com\', \'2345678\', \'163\'), (\'2345678@163.com\', \'2345678\', \'163\'), (\'345678@163.com\', \'345678\', \'163\')] 

而使用finditer我们无需手动将整个正则用()括起来group()代表整个正则的匹配

实际中我们根据我们的需求选择方法既可。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容