2016-08-26 59 views
1

我可以寫一個匹配一個日誌行的正則表達式。但是我的文件包含一些不同於其他日誌行的日誌行,因爲只有一些額外的字段或少數幾個字符,鍵值對會混淆在一起。正則表達式可能會略有不同的日誌行 - 火花

例如,一個日誌行: case_id=1 event_id=35654423 date=30-12-2010 time=11.02 activity=registerrequest name=Pete costs=50 rerr="-"

另一個問題:case_id=1 event_id=35654424 date=31-12-2010 time=11.07 costs=400 rerr="-" activity=examinethoroughly name=Sue rloc="-"

我的日誌模式= "^([^\s]+)\s([^\s]+)\s([^\s]+)\s([^\s]+)\s([^\s]+)\s([^\s]+)\s([^\s]+)\s([^\s]+)" 這是我在火花分組代碼:

match = re.search(LOG_PATTERN,line) 
Case_ID = match.group(1) 
Event_ID = match.group(2) 
Date = match.group(3) 
Time = match.group(4) 
Activity = match.group(5) 
Resource = match.group(6) 
Costs = match.group(7) 
Rerr = match.group(8) 

此代碼將只匹配第一個日誌行。 如何編寫正則表達式,以便我可以將它們組合成火花而不忽略任何日誌行?

+0

一句話:有些值在引號內,你使用'[^ ​​\ s] +' - 這會在匹配中包含引號 - 可以嗎? –

+0

沒錯。 – kaks

回答

1

我建議你使用一個簡單的正則表達式來抓取鍵和值:

rx = "(\\S+)=(\\S+)" 

rx = "(\\w+)=(\\S+)" 

看到一個regex demo

然後,創建一個字典,re.findall

d = dict([(x,y) for x,y in re.findall(rx,line)]) 

然後,您可以訪問每個鍵值。

+0

我試過上面的代碼,但我收到一個錯誤的收集命令說輸入路徑是錯誤的,即使我已經給出了正確的。我已將我的代碼添加到問題中。 – kaks

+0

所以,該錯誤根本不屬於正則表達式,它只是說它找不到該文件。 –

+0

你說得對。不管怎麼說,還是要謝謝你。將打開另一個問題。 – kaks