python中re的finditer与findall有什么不同?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
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()代表整个正则的匹配
实际中我们根据我们的需求选择方法既可。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。