2015-01-05 44 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'字符串的所有组合列表。 –

相关问题