我正在研究一个项目,在这个项目中,我需要搜索短到中文本(最多100个会话)的存在1000个不同的关键字(股票市场符号)。我正在使用Python。
现在,我知道如果我用一个简单的For循环来处理这个问题,这可能会花费很长时间。
做这件事最有效的方法是什么?这里是否有一个特定的python库是最有利的?
编辑:关于我的用例的更多细节:
- 我正在搜索的文本主体是不同长度的Reddit帖子(假设上限长度为2000个字符)。
- 我将搜索大约100 - 200个不同的帖子每届。
- 我需要检查每个帖子中是否存在1个或多个股票符号。有1000的股票符号搜索,他们是在不同的格式表示,这样我需要检查部分匹配(即。$GOOG和$GOOG在正文中都匹配)。
- 我需要列出在给定帖子中发现的符号。
我希望这能提供一些澄清。
谢谢。基于答案的
发帖方案
这是我最终用来将股票符号编译成正则表达式的基本代码。请注意,这些符号存储在一个名为"self.symbols"的Python字典中。-其中每个密钥都是一个交换,并且包含一个符号列表作为它的值。
#Return the dict of stock symbols
def compileSymbols(self):
#Will hold compiled symbols
dict = {}
#For each exchange in dict, join list of symbols and convert to compiled regex
for key in self.symbols.keys():
joinedStr = "|".join(self.symbols[key])
dict[key] = re.compile(r"{0}".format(joinedStr))
#Save compiled symbols
self.symbols = dict
…然后,我使用下面的代码循环遍历post文本并搜索符号—将结果转换为集合并返回到列表以删除重复项:
#Check posts for matching symbols
def searchPostsForSymbols(self, posts, symbols):
for post in posts:
#Used to store matching symbols
matches = []
for exchng in symbols.keys():
result = symbols[exchng].findall(post, re.M)
result = list(set(result))
if len(result) > 0:
matches.append((exchng, result))
花了几秒钟搜索1000个符号-令人惊讶的好性能。谢谢Malo的回答!
下面是一个使用regexp可以得到的示例。如果它对你的情况有用,请试着计时:
import re
text = """
This is text with
ThiGOOGs is text with
This is tMICRext with
This is text with
This isGOOG text with
This is text with
"""
c = re.compile(r"STOCK|GOOG|MICR")
r = c.findall(text, re.M)
print(r)
输出是:
['GOOG', 'MICR', 'GOOG']