为字符串查找设置vs. Regex,它更具可扩展性?

时间:2013-04-29 00:06:39

标签: python regex data-structures set

假设我需要处理一个非常大的单词列表,我需要计算我在一段文本中找到这些单词的次数。 哪个是可扩展性方面的最佳选择?

选项I(正则表达式)

>>> import re
>>> s = re.compile("|".join(big_list))
>>> len(s.find_all(sentence))

选项II(套)

>>> s = set(big_list)
>>> len([word for word in sentence.split(" ") if word in s]) # O(1) avg lookup time

示例:如果列表是[“cat”,“dog”,“knee”]并且文本是“狗跳过猫,但是狗摔断了膝盖”,最终结果应该是:4

P.S。欢迎任何其他选择

2 个答案:

答案 0 :(得分:2)

如果你的单词是字母数字,我可能会使用类似的东西:

s = set(big_list)
sum(1 for x in re.finditer(r'\b\w+\b',sentence) if x.group() in s)

由于集合的隶属度测试平均为O(1),因此该算法变为O(N + M),其中N是句子中的单词数,M是big_list中的元素数。不是太寒酸。它在内存使用方面也做得很好。

答案 1 :(得分:0)

可伸缩方法是对输入字典和文本中的单词进行排序,然后使用两个迭代器进行匹配。您还可以use a trie获得更好的效果。我不知道集合的内部表示,但是,使用大的正则表达式将是一个完全矫枉过正。