2012-09-05 50 views
1

我有一個很長的短字符串列表,我想在(通常)很長的文本字符串中搜索所有這些項目。我的列表長度約爲500個短字符串,我希望能夠使用python查找出現在大約〜10,000個字符的源文本中的所有內容。在python中搜索文本正文中的多個項目的最快方法

這裏是我的問題的一個簡單的例子:

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個項目,其中有一個長度爲10,000個字符的cleanText),它看起來比我想要的慢一點。

+0

您的內容是否持續存在?你可以使用全文索引解決方案嗎? –

回答

6

你可以嘗試一個正則表達式。這可能會加快速度的大名單:

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

(當然,這個假設沒有什麼在searchList,將需要進行轉義爲re的目的。)


正如指出的在評論(感謝anijhaw),你可以通過做退讓:

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

您也可以預編譯正則表達式,如果你會使用一次以上的機智h re.compile例如:。

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

免責聲明這些解決方案只能找到非重疊匹配。

+0

你可以使用re.escape作爲 – anijhaw

+0

並且編譯你的正則表達式,如果你打算不止一次使用它 – anijhaw

+0

@anijhaw - 只要你是re.escape步驟,預編譯真的只會節省你在程序中不使用正則表達式,因爲''re'緩存了內部的前幾個效率。 – mgilson

相關問題