为什么不总是使用Python的re.findall而不是re.search

时间:2017-12-28 18:51:03

标签: python python-3.x

我已经学习python几周了。目前我在Python的re.findall()中遇到了一些问题/疑问。 在一些书籍或视频中,他们使用re.search()很少使用match()。在django文档中,我读取搜索找到第一个匹配,并且re.match在字符串的开头找到匹配。

但在所有情况下,re.findall()都能正常运行。那么为什么我不应该一直只使用re.findall()?

由于我想在Python中变得更好,我想了解它,因此我问了这个问题。

最好的问候乔纳森

1 个答案:

答案 0 :(得分:1)

最重要的原因是性能:findall需要查找所有出现的内容,因此它会搜索整个字符串。 search只搜索字符串直到找到匹配项,因此如果模式存在则会更快。 match只是检查字符串的开头是否与模式匹配,因此它可能不需要搜索整个字符串(在某些边缘情况除外)。

因此,findall在最佳情况下会比matchsearch慢。

此外findall还会存储所有匹配项,因此它可以轻松占用比仅存储第一个匹配项的searchmatch更多的内存(或者根本不存储任何内容)。

所以findall的内存更贵。

最后但并非最不重要matchsearch返回SRE_Match个对象,这些对象不仅存储匹配的子字符串,还存储位置(如果使用带捕获组的模式,则为组)。谢谢@kindall在评论中发布了这个内容。

因此,虽然您可以使用findall代替matchsearch,但它可能会更慢,使用更多内存并为匹配存储更少的信息。因此,我不会将其用作searchmatch的替代品,除非您需要查找所有其他事件。