【问题标题】:Returning unique matches using regex in python在python中使用正则表达式返回唯一匹配
【发布时间】:2015-11-12 00:34:07
【问题描述】:

生成正则表达式的所有唯一匹配项的最有效(或最 Pythonic)的方法是什么?现在我只是在使用findall后申请set(),但我不确定是否有更好的方法。

【问题讨论】:

  • 申请set 对我来说似乎是合理的。
  • 使用set 是一种很好的默认方式,但是您是否包含一些代码,以便我们看看是否有更好的方式:)。
  • 最Pythonic的方式当然是使用set(),这可能也是最有效的。

标签: python regex python-3.x


【解决方案1】:

查找所有匹配项的其他方法

使用正则表达式在文本中搜索的其他方式允许您与一路上获得的匹配进行交互,并允许您将其与您的列表进行比较,从而消除一路上的重复。这种方法意味着,在最坏的情况下,您会将每个匹配项与所有其他匹配项进行比较,并且永远不会找到重复项。当然,有一些方法可以加快速度,比如在找到匹配项时将匹配项放在 set 中,由于 set 的实现,这将导致每次查找都以 O(1) 表示法运行。这基本上是任何操作所能拥有的最佳运行时间,对于set 的任何大小都是如此。

慢python和快C

因此,如果您进行了一次匹配并将其添加到 set,则每个项目都需要 1 个运行时间才能附加到 set,对于找到的 n 项目,总计为 O(n)。您没有包括的是框架管理循环、位置参数等所需的时间。 python 中的re 模块是用C 语言编写的,这在批处理时要快得多。实际上有一些包被设计用来执行需要循环的操作,并通过使用 C 来将它们的速度提高几个数量级。一个例子是numpy。如果您想了解这种差异有多大,请观看this video from PyCon 2015

我很确定,虽然我没有测试它,但尝试匹配findall 使用正则表达式提取所有匹配项的速度是不可能的。由于它没有 python 代码拖慢进程的速度,是用 C 语言编写的,它无疑是使用 regex 获得结果的最快方法。

由于在findall 返回列表之前您无法与匹配项进行交互,因此您可以通过python 中的列表消除重复项。这篇文章中的示例很好地解释了这一点:

Removing duplicates in lists

获取唯一项目集合的常用方法是使用 放。集合是不同对象的无序集合。创建一个 从任何可迭代的集合中,您可以简单地将其传递给内置的 set() 功能。如果您稍后再次需要真实列表,您可以类似地通过 设置为 list() 函数。

以下示例应涵盖您尝试做的任何事情:

>>> t = [1, 2, 3, 1, 2, 5, 6, 7, 8]
>>> t
[1、2、3、1、2、5、6、7、8]
>>> 列表(集合(t))
[1、2、3、5、6、7、8]
>>> s = [1, 2, 3]
>>> 列表(集合(t)-集合)
[8、5、6、7]

我已经了解了set 在查找重复项方面的出色表现,它的执行速度与您可以使用循环手动放入项目的速度相同。这意味着如果你使用这两种获取所有匹配项和消除重复项的方式,你已经超出了你在 python 代码中可以复制的内容。

结论

除非在已编译的模块中可以同时执行这两种操作,否则我怀疑您能否超越 findallset 已经运行的速度。

【讨论】:

  • 我正要提出一个简短的答案,但这比我的要好得多:)。
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2014-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多