2016-10-14 40 views
1

我想解析一些日誌,它以鍵對格式返回一些響應。我只想要它們包含在最後一個密鑰對(Rs:{「..」})中的值。我想要的信息都包含在大括號內。在Python中使用正則表達式檢索日誌消息

我所做的就是用正則表達式匹配花括號內像這樣的東西:

import re 

log = '2016-10-13 17:04:50 - info - uri:"GET x/y/z" ip:1.1.1.1 Rs:{"data": "blah blah"}' 

text = re.compile("Rs\:{(.*)\}").search(log).group(1) 
print (text) 

>>> "data": "blah blah" 

# Desired results 
>>> {"data": "blah blah"} 

但也有一些問題,做這種方式:

  1. 我還希望啓動大括號並關閉大括號。

  2. 此方法不工作,如果有其他的開口(「{」)或關閉(「}之前或RS值內:)大括號內。

有沒有更好的方式來做到這個?

+0

首先,修復代碼,你在'log'行缺少'''。然後,使用'r「Rs:({[^}] *})」''正則表達式。或者請澄清一下:你想要一本字典作爲輸出嗎? –

+0

@WiktorStribiżew只需從{..}開始的整行就是我需要的。不需要字典。 – Cryssie

回答

0

看來你需要兩件事情:重新調整第一個捕獲組邊界以包括花括號,並使用懶惰版本.*(如果字符串中有多個值)。如果您使用的是re.search,或者只是使用re.findall

import re 
log = '2016-10-13 17:04:50 - info - uri:"GET x/y/z" ip:1.1.1.1 Rs:{"data": "blah blah"}' 
text = re.compile(r"Rs:({[^}]*})").search(log) 
if text: 
    print (text.group(1)) 
# or 
print(re.findall(r"Rs:({[^}]*})", log)) 

Python demo online

圖案的詳細資料

1

第一部分很簡單:只要將捕獲的括號出一點點用這個作爲你的正則表達式:

"Rs:(\{.*\})" 

另一個問題是更加複雜 - 如果你想的休息該行(起始於{),然後

r'Rs:(\{.*)\Z' 

會得到你想要的。

相關問題