Python正则模块re中findall与finditer的区别及使用场景详解

( - 这篇文章是个人学习和使用的摘要。如果有任何错误,请随时纠正它们)

Python正则模块re中findall与finditer的区别及使用场景详解

Python常规模块中的Findall和Finder相似,但是存在很大的差异。

两者都可以获得所有匹配结果,这与搜索方法截然不同。同时,区别在于,一个人返回列表,一个人返回火柴样本类型迭代器

假设我们有这样的数据:其中数字代表电话号码,而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。当分组多个数据包时,将返回数据包。

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

因此,如果我们需要在整个常规和每个组之间获得匹配

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

使用Finder时,我们不需要手动将整个常规()group()()用来表示整个常规的匹配。

实际上,我们可以根据需要选择该方法。

你可能想看:
« 上一篇
下一篇 »

相关推荐

python爬虫教程PDF,Python爬虫书PDF

2026年09月02日

31阅读

外国教程python,python编程教学视频

2026年09月02日

25阅读

python简明教程沈洁元,python详细基础教程

2026年09月02日

21阅读

python库包教程,python 包

2026年09月02日

27阅读

python教程大全集,python教程600集

2026年09月02日

26阅读

python入门教程完整版,python零基础入门全套教程视频

2026年09月02日

22阅读