Python:在大型字符串中查找部分字符串匹配

时间:2008-12-12 08:49:03

标签: python search

我对在Python中实现自动完成感兴趣。例如,当用户键入字符串时,我想在磁盘上显示名称以该字符串开头的文件子集。

查找大型语料库中某些条件(比如几十万个字符串)的字符串的有效算法是什么?类似的东西:

matches = [s for s in allfiles if s.startswith(input)]

我希望条件灵活;例如。只要输入中的所有字母以相同的顺序出现在s中,它就是匹配而不是严格的startwith。什么比我在这里展示的蛮力方法更好?

5 个答案:

答案 0 :(得分:6)

对于精确匹配,通常实现此类内容的方法是将您的语料库存储在trie中。我们的想法是将每个字母存储为树中的节点,链接到单词中的下一个字母。找到匹配只是走在树上,并显示当前位置的所有孩子。例如。 “cat”,“cow”和“car”将存储为:

  a--t
 / \ 
c   r
 \
  o--w

当你得到一个c,你从c节点开始,a然后会带你到c / a节点(孩子们) “t”和“r”,将猫和车作为你的完成品。)

请注意,您还需要标记完整单词的节点来处理作为其他子串的名称(例如“car”和“cart”)

要获得所需的模糊匹配,您可能需要进行一些更改。

答案 1 :(得分:3)

我使用Lucene自动填充了超过十万种可能性的文本字段,我觉得它是即时的。

答案 2 :(得分:1)

也许readline模块正是您所寻找的。它是GNU readline库Python Documentation的接口。 也许你可以用set_completer()提供自己的completition函数。

答案 3 :(得分:0)

您希望匹配字符串的灵活性称为模糊匹配模糊搜索。我不知道任何python实现(但我没有仔细研究过这个主题)但是你可以重用C / C ++实现,比如支持带模糊参数的regexp的TRE packaged

除此之外,总是存在一个问题,即你的单词总列表是否适合记忆。如果没有,将它们保存在列表中是不可行的,并且必须将某些内容缓存到磁盘或数据库中。

答案 4 :(得分:0)

(仅解决问题的字符串匹配部分)

如果你想自己快速尝试一下,为什么不创建一些词典,每个词典都将初始模式映射到字符串列表

  • 每个词典都以特定长度的初始模式为基础
  • 字符串列表中的所有字符串都以初始模式
  • 开头
  • 只有小于列表中的某个数字(例如10个)字符串时,才会创建初始模式/字符串列表对

因此,例如,当用户键入三个字符时,您可以使用长度为3的键查找字典。如果匹配,则表示您可以立即使用1到10种可能性。