2015-01-05 24 views
4

我有Python應用程序。檢查字符串是否包含列表中的任何字的最快方法

有450個禁止短語的列表。有來自用戶的消息。我想檢查一下,這個消息是否包含任何這種禁止的階段。什麼是最快的方法呢?

目前我有這樣的代碼:

message = "sometext" 
lista = ["a","b","c"] 

isContaining = false 

for a, member in enumerate(lista): 
if message.contains(lista[a]): 
    isContaining = true 
    break 

有沒有更快的方式做到這一點?我需要在不到1秒內處理消息(最多500個字符)。

+0

'isContaining =任何(在信息x在LISTA x)的所有'的 – falsetru

+1

首先,刪除'enumerate'和'一個,'部分。用'member'替換'lista [a]'。其次,「進」功能不是更快?因此類似於'if member in message:' – Mathias711

+1

成員測試在[a'set'](https://docs.python.org/2/library/stdtypes.html#set-types-set-frozenset)上更快。 – jonrsharpe

回答

8

還有就是any內置函數專門爲:

>>> message = "sometext" 
>>> lista = ["a","b","c"] 
>>> any(a in message for a in lista) 
False 
>>> lista = ["a","b","e"] 
>>> any(a in message for a in lista) 
True 

另外,您可以檢查集合的交集:

>>> lista = ["a","b","c"] 
>>> set(message) & set(lista) 
set([]) 
>>> lista = ["a","b","e"] 
>>> set(message) & set(lista) 
set(['e']) 
>>> set(['test','sentence'])&set(['this','is','my','sentence']) 
set(['sentence']) 

但你將無法檢查子詞:

>>> set(['test','sentence'])&set(['this is my sentence']) 
+0

謝謝,我會用並接受你的回答! – TN888

+0

此外,排序lista中的單詞,以便最小的是第一個(我假設這些消息中出現的機會最高) – RemcoGerlich

+1

set(message)如果他正在查找與字符相對的單詞,它將不起作用。 – RemcoGerlich

1

我將與in運營商any內建結合:

isContaining = any(a in message for a in lista) 

我不知道這是最快的方式,但它似乎最簡單的給我。

3

使用regex compile from list

考慮存儲器和建築時間或表達,編譯提前。

lista = [...] 
lista_escaped = [re.escape(item) for item in lista] 
bad_match = re.compile('|'.join(lista_escaped)) 
is_bad = bad_match.search(message, re.IGNORECASE) 
+3

與re.escape()結合進行固定字符串搜索。 re.compile將爲掃描字符串創建一個整潔優化的狀態機。 –

0

我們也可以使用setintersection方法

>>> message = "sometext" 
>>> lista = ["a","b","c"] 
>>> isContaining = False 
>>> if set(list(message)).intersection(set(lista)): 
... isContaining = True 
... 
>>> isContaining 
False 
>>> message = "sometext a" 
>>> list(message) 
['s', 'o', 'm', 'e', 't', 'e', 'x', 't', ' ', 'a'] 
>>> if set(list(message)).intersection(set(lista)): 
... isContaining = True 
... 
>>> isContaining 
True 
+1

只適用於單字符短語。 – RemcoGerlich

+0

是的,我需要創建'message'字符串的所有組合列表。 –

相關問題