2016-08-19 93 views
2

我有一個日誌文件,我試圖用正則表達式(python)來解析。每行包含標籤「BEGIN」和「END」。另外,一行可能包含一個或多個位於「BEGIN」和「END」標籤之間的「VALUE」標籤。如果給定行上沒有「VALUE」標籤,我想要在「BEGIN」和「END」標籤之間截取字符串。但是,如果給定行上有「VALUE」標記,我想要捕獲標記「BEGIN」...「VALUE」,「VALUE」...「VALUE」和「VALUE」之間的所有字符串。 ..「END」標籤對。請注意,捕獲字符串也可能爲空。正則表達式捕獲給定的字符串錨點之間的字符串

給定的輸入:

Line1: words we can ignoreBEGINvalue1VALUEvalue with [email protected] we can ignore 
Line2: BEGINvalue1VALUEVALUEVALUElastvalueENDwords we can ignore 
Line3: words we can ignoreBEGINlastvalueEND 

正則表達式應該返回:

Line1: (1)value1 (2)value with space (3)[email protected] (4)lastvalue 
Line2: (1)value1 (2) (3) (4)lastvalue 
Line3: (1)lastvalue 

下面的正則表達式失敗,如果有一個以上的線路一個「VALUE」標籤,在這種情況下,它似乎只捕捉「BEGIN」...「VALUE」和「VALUE」...「END」之間的字符串,但未能捕獲「VALUE」...「VALUE」匹配項:

BEGIN(.*?)(?:VALUE(.*?))*END 
+0

這隻適用於PyPi正則表達式模塊。在下面看到更好的選擇。 –

回答

1

沒有充分利用正則表達式的簡單方法,在BEGIN和END之間捕捉所有內容,然後用VALUE分割它。

>>>test_cases = ['words we can ignoreBEGINvalue1VALUEvalue with [email protected] we can ignore', 'BEGINvalue1VALUEVALUEVALUElastvalueENDwords we can ignore', 'words we can ignoreBEGINlastvalueEND'] 
>>> patt = re.compile(r'BEGIN(.*)END') 
>>> for test in test_cases: 
...  matched = patt.search(test) 
...  if matched is not None: 
...   print matched.group(1).split('VALUE') 

['value1', 'value with space', '[email protected]', 'lastvalue'] 
['value1', '', '', 'lastvalue'] 
['lastvalue'] 
+1

我相信'r'BEGIN(。*?)END''會更好,以防一行中有多於1個開始 - 結尾對。 –

相關問題