2012-01-17 108 views
7

有沒有辦法查看某行是否包含與一組正則表達式模式相匹配的單詞? 如果我有[regex1, regex2, regex3],我想查看一行是否匹配其中的任何一行,我該怎麼做? 現在,我正在使用re.findall(regex1, line),但它一次只匹配1個正則表達式。使用Python將一行與多個正則表達式匹配

回答

20

您可以使用內置函數any(或all,如果所有正則表達式必須匹配)和一個生成器表達式來通過所有正則表達式對象。

any (regex.match(line) for regex in [regex1, regex2, regex3])

(或any(re.match(regex_str, line) for regex in [regex_str1, regex_str2, regex_str2])如果正則表達式沒有預編譯regex對象,當然)

雖然將相比,你正則表達式中的單個表達式組合是ineficient - 如果這個代碼是時間或cpu critical,則應嘗試使用特殊的|正則表達式來分隔原始表達式,然後組合一個包含所有需求的正則表達式。 一個簡單的方法將所有regexs結合是使用字符串「加入」運營商:

re.match("|".join([regex_str1, regex_str2, regex_str2]) , line)

雖然這種形式的結合正則表達式可能會導致錯誤的表現,如果原有的已經做使用的|運營商。

+2

如果將每個表達式包裝在圓括號中,可以使聯接方法不太可能失敗。 '('+')|('。join(['foo','bar','baz'])+')''給出''(foo)|(bar)|(baz)''。 – FakeRainBrigand 2012-01-17 02:02:34

+3

更好的是,在'(?:...)'中換行,並將字符串放在一起,以突出其邏輯結構。例如,'''''.join('(?:{0})'.format(x)表示x('foo','bar','baz'))'。 – 2012-01-17 02:53:12

+0

爲我工作....謝謝 – Prateek 2018-01-23 08:57:54

1

試試這個新的正則表達式:(regex1)|(regex2)|(regex3)。這將匹配任何3個正則表達式中的一行。

+1

'(?:...)'在這裏可能比'(...)'更好,避免產生虛假的捕獲組。 – 2012-01-17 02:52:56

+1

@Karl ...除非你想檢查'.group(n)'的真實性,以確定你捕獲了哪個*組。 – 2014-08-08 21:12:07

1

您可以通過正則表達式項目進行循環並執行搜索。

regexList = [regex1, regex2, regex3] 

line = 'line of data' 
gotMatch = False 
for regex in regexList: 
    s = re.search(regex,line) 
    if s: 
     gotMatch = True 
     break 

if gotMatch: 
    doSomething()