Python中re.findall()和re.finditer()方法有什么区别?
在Python的正则表达式模块中,re.findall()和re.finditer()方法都可以用来查找匹配某个正则表达式的字符串,但它们之间有一些区别。
阅读更多:Python 教程
re.findall()
re.findall()用于查找字符串中所有与正则表达式匹配的子串,并返回一个由所有匹配子串组成的列表。如果没有找到匹配结果,则返回一个空列表。
下面是一个简单的示例,查找字符串中所有数字:
import re
text = "The price of the book is 24.99 and the price of the apple is0.49."
result = re.findall(r'\d+\.\d+', text)
print(result)
输出结果为:
['24.99', '0.49']
在上面的代码中,r’\d+.\d+’是一个正则表达式,用于匹配小数。re.findall()函数在text字符串中查找所有匹配正则表达式的子串,将其放在一个列表中,最后通过print语句输出。
re.finditer()
re.finditer()函数和re.findall()函数类似,不同的是它将返回一个迭代器,迭代器包含的是每次匹配的MatchObject对象,而不是匹配的子串。
比如,我们可以使用re.findall()对text字符串进行小数匹配,得到一个包括所有匹配结果的列表,如下所示:
import re
text = "The price of the book is 24.99 and the price of the apple is0.49."
result = re.findall(r'\d+\.\d+', text)
print(result)
这个程序将输出:
['24.99', '0.49']
我们可以使用re.finditer()对text字符串进行小数匹配,得到一个迭代器,迭代器包含所有匹配的MatchObject对象,如下所示:
import re
text = "The price of the book is 24.99 and the price of the apple is0.49."
matches = re.finditer(r'\d+\.\d+', text)
for match in matches:
print(match.group(0))
输出结果为:
24.99
0.49
在这个程序中,re.finditer()函数返回一个迭代器matches,包含了每次匹配的MatchObject对象。我们通过一个for循环来遍历matches,match.group(0)用于输出匹配到的子串。
re.findall()和re.finditer()的区别
因为re.findall()函数返回的是匹配到的子串组成的列表,所以我们可以直接使用len()函数获取元素个数。
而re.finditer()返回的是迭代器,我们需要使用for循环逐个获取匹配的对象,才能获取每个匹配结果。
此外,由于re.finditer()返回的是迭代器,它能够更加节省内存,尤其是匹配结果很大的时候,使用迭代器比使用列表更好。
结论
在Python的正则表达式模块中,re.findall()函数用于查找字符串中所有与正则表达式匹配的子串,并返回一个由所有匹配子串组成的列表;而re.finditer()函数用于查找字符串中所有与正则表达式匹配的子串,并返回一个迭代器,迭代器包含的是每次匹配的MatchObject对象。使用re.finditer()可以节省内存,适合于匹配结果很大的情况。