2013-06-21 74 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引擎,但我支持你的結論。 –