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()()用来表示整个常规的匹配。
实际上,我们可以根据需要选择该方法。