【问题标题】:Fastest way in python to search for multiple items in a body of textpython中搜索正文中多个项目的最快方法
【发布时间】:2012-09-05 17:41:01
【问题描述】:

我有一长串短字符串,我想在(通常)长文本字符串中搜索所有这些项目。我的列表的长度约为 500 个短字符串,我想使用 python 查找大约 10,000 个字符长的源文本中出现的所有内容。

这是我的问题的一个简短示例:

cleanText = "four score and seven years ago our fathers brought forth on this continent a new nation conceived in Liberty and dedicated to the proposition that all men are created equal"
searchList = ["years ago","dedicated to","civil war","brought forth"]

我目前在 cleanText 中查找 searchList 中的项目的方法是:

found = [phrase for phrase in searchList if phrase in cleanText]

这是python中最快的方法吗?它并不是很慢,但在规模上(searchList 中有 500 个项目,cleanText 的长度为 10,000 个字符)似乎比我想要的要慢一些。

【问题讨论】:

  • 您的内容是否具有持久性?您可以使用全文索引解决方案吗?

标签: python list search


【解决方案1】:

你可以试试正则表达式。这可能会加快大型列表的速度:

import re
found = re.findall('|'.join(searchList),cleanText)

(当然,这是假设searchList 中没有任何内容需要为re 转义。)


正如 cmets 中指出的(感谢 anijhaw),您可以通过以下方式进行转义:

found = re.findall('|'.join(re.escape(x) for x in searchList), cleanText)

如果您将通过re.compile 多次使用正则表达式,也可以预编译它,例如:。

regex = re.compile('|'.join(re.escape(x) for x in searchList))
found = regex.findall(cleanText)

免责声明这些解决方案只能找到非重叠匹配项。

【讨论】:

  • 你可以使用 re.escape
  • 如果你不打算多次使用它,还要编译你的正则表达式
  • @anijhaw -- 预编译真的只会在你执行 re.escape 步骤时节省你,只要你没有在你的程序中使用 lots 的正则表达式,因为@987654327 @ 在内部缓存前几个以提高效率。
  • @StevenRumbalski -- 有些人不喜欢re?也许这实际上并没有更快,因此它不是一个解决方案......我也不知道。那好吧。我没有被冒犯(如果有人给我评论如何改进它,我很乐意改进这个答案:)。
  • 此解决方案的唯一问题是,如果两个搜索字符串重叠,正则表达式将无法同时找到它们。但是对于很多(500)个搜索字符串,这肯定会更快。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
  • 2011-08-25
  • 2017-04-07
  • 2012-08-28
  • 2018-01-17
  • 2013-07-05
  • 1970-01-01
相关资源
最近更新 更多