生成正则表达式的所有唯一匹配的最有效(或最Pythonic)方法是什么?现在我只是在使用set()
之后应用findall
,但我不确定是否有更好的方式。
答案 0 :(得分:3)
使用其他方法使用正则表达式搜索文本时,您可以与沿途获得的匹配项进行交互,并允许您将其与列表进行比较,从而消除重复项。这种方法意味着,在最糟糕的情况下,您将比较所有其他匹配项,并且永远不会找到重复项。当然,有一些方法可以加快速度,例如在找到匹配项时将set
放入set
,由于set
的实现会导致每个查询以O(1)表示法运行。这基本上是任何操作都可以拥有的最佳运行时间,对于任何大小的set
都是如此。
因此,如果您执行了一次匹配并将其添加到set
,则每个项目都需要1次运行时间才能附加到n
,re
总计为O(n)找到的物品。你没有包括的是框架管理循环,位置参数等所需的时间。 python中的numpy
模块是用C语言编写的,批处理工作要快得多。实际上有一些软件包旨在通过使用C来进行需要循环的操作并将其速度提高几个数量级。这样的一个例子是findall
。如果您想了解这种差异有多大,请观看this video from PyCon 2015
我很确定,虽然我没有测试它,试图匹配findall
提取所有匹配与正则表达式的速度是不可能的。由于它没有python代码阻塞进程的速度,用C语言制作,无疑是用正则表达式获得结果的最快方法。
由于在set
返回列表之前无法与匹配进行交互,因此您可以使用方法消除python中列表中的重复项。这篇文章中的例子很好地解释了这一点:
获取唯一项目集合的常用方法是使用a 组。集合是不同对象的无序集合。创建一个 从任何可迭代设置,你可以简单地将它传递给内置的set() 功能。如果您以后再次需要一个真实的列表,您可以同样通过 设置为list()函数。
以下示例应涵盖您要执行的操作:
>>> t = [1,2,3,1,2,5,6,7,8]
>>> Ť
[1,2,3,1,2,5,6,7,8]
>>>列表(集(t))的
[1,2,3,5,6,7,8]
>>> s = [1,2,3]
>>> list(set(t) - set(s))
[8,5,6,7]
我已经查看了findall
查找重复项的好处,它会以与您使用循环手动放置项目相同的速度执行此操作。这意味着如果你使用这两种获取所有匹配并消除重复的方法,那么你已经超出了你可以在python代码中复制的内容。
除非在编译模块中提供这两种操作的组合方式,否则我怀疑你是否可以超过set
和 # center all cells
for col in w_sheet.columns:
for cell in col:
# openpyxl styles aren't mutable,
# so you have to create a copy of the style, modify the copy, then set it back
alignment_obj = cell.alignment.copy(horizontal='center', vertical='center')
cell.alignment = alignment_obj
已经工作的速度。