2016-09-21 64 views
1

試圖在python中編寫腳本進行一些後期處理。我有一個包含具有時間戳的消息的文件。我想將所有消息提取到列表中。
正則表達式 - 從消息開始直到下一個時間戳。爲什麼向前看是時間戳記的返回匹配

findallItems = re.findall(r'(?s)((?<=message).*?(?=((\d{4})\-((0[1-9])|(1[0-2]))\-((0[1-9])|(1[0-2]))|\Z)))', fileread) 

這工作正常,但它也作爲匹配返回時間戳。我如何才能返回信息並且不包含時間戳?

如果我使用向前的位置作爲文本,那麼它工作正常。對於如

findallItems = re.findall(r'(?s)((?<=message).*?(?=message|\Z))',fileread) 
+1

提供您正在解析的示例輸入消息和所需的輸出。謝謝。 – alecxe

+0

是的。示例輸入將非常有用,所以我們可以幫助您。 – ThePerplexedOne

+0

將前視內部的捕獲組更改爲非捕獲組'(?:...)' – revo

回答

1

您需要刪除不必要的捕獲括號和其他轉換爲非捕獲:

findallItems = re.findall(r'(?s)(?<=message).*?(?=(?:\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-2])|\Z))', fileread) 

this regex demo

然而,你可能只是保持1個捕獲組在您需要的模式和re.findall將只返回此組值:

(?s)message(.*?)(?:\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-2])|\Z) 
     ^^

請參閱another regex demo

+1

快速和工作答案肯定值得讚賞:) – jas

相關問題