2013-06-21 75 views
1

有什么好的Python的方式来子列表匹配的字符串列表,像下面这样:匹配列表

if 'sub1' in str1 or 'sub2' in str1 or ... 'subN' in str1 or\ 
    'sub1' in str2 or 'sub2' in str2 or ... 'subN' in str2 or\ 
    ... 
    'sub1' in strM or 'sub2' in strM or ... 'subN' in strM: 

一种方法是使他们团结起来列表理解,如下所示:

strList = [str1, str2, ..., strM] 
subList = ['sub1', ..., 'subN'] 
if any(sub in str for sub in subList for str in strList): 

有什么更好的,像库函数可能吸收其中一个维度?

非常感谢。

+0

如果字符串足够短(而不是太多),你可以撰写他们为正则表达式:'SUB1 | SUB2 | SUB3 | ... | subN' – alexis

+0

根据串的数量和大小,将所有'str [1..n]连接成一个大的字符串,然后使用正则表达式或'any(... in ...)'检查一次子字符串可能会更快。 –

+0

@TimPietzcker这是一个有趣的想法。但是我的具体情况的优点是子串是静态的,而字符串是动态的,所以我可以预先计算子串RE一次并在整个地方使用它。但这还是很原始的,非常感谢。 – gt6989b

回答

3

您可以将子字符串编译为正则表达式,然后使用它来搜索每个字符串。如果你没有那么多子串,RE超过内部限制,这可能是最有效的方法。

pattern = "|".join(re.escape(s) for s in subList) 
crexp = re.compile(pattern) 
if any(crexp.search(s) for s in strList): 
    ... 
3

正如this answer中所述,正则表达式是要走的路,因为它们被建模为可以同时检查所有子字符串的DFA。你应该可以阅读这个答案,因为它非常深入。

+0

Python的正则表达式引擎没有实现DFA引擎,但我支持你的结论。 –