簡體   English   中英

Python:解析日志文件的各個部分

[英]Python: parsing sections of a log file

我有一個日志文件的一部分,看起來像這樣:

"/log?action=End&env=123&id=8000&cat=baseball"
"/log?action=start&get=3210&rsa=456&key=golf"

我想解析每個部分,以便結果如下所示:

('/log?action=', 'End', 'env=123', 'id=8000', 'cat=baseball')
('/log?action=', 'start', 'get=3210', 'rsa=456', 'key=golf')

我研究了正則表達式和匹配項,但是我的很多日志都有不同的順序,這使我相信這是不可能的。 有什么建議么?

顯然,這是URL的一部分,因此解析它的最佳方法是使用URL解析工具。 stdlib隨urlparse一起urlparse ,它正是您想要的功能。

例如:

>>> import urlparse
>>> s = "/log?action=End&env=123&id=8000&cat=baseball"
>>> bits = urlparse.urlparse(s)
>>> variables = urlparse.parse_qs(bits.query)
>>> variables
{'action': ['End'], 'cat': ['baseball'], 'env': ['123'], 'id': ['8000']}

如果您確實想要獲得所需的格式,則可以改用parse_qsl ,然后將鍵值對重新組合在一起。 我不確定為什么要將/log包含在第一個查詢變量中,或將第一個查詢變量的值與其變量分開,但是即使您堅持這樣做,也可以這樣做:

>>> variables = urlparse.parse_qsl(s)
>>> result = (variables[0][0] + '=', variables[0][1]) + tuple(
    '='.join(kv) for kv in variables[1:])
>>> result
('/log?action=', 'End', 'env=123', 'id=8000', 'cat=baseball')

如果您使用的是Python 3.x,只需將urlparse更改為urllib.parse ,其余的完全一樣。

您可以拆分幾次:

s = '/log?action=End&env=123&id=8000&cat=baseball'
L = s.split("&")
L[0:1]=L[0].split("=")

輸出:

['/log?action', 'End', 'env=123', 'id=8000', 'cat=baseball']

在不知道可能的輸入域是什么的情況下很難說,但這是一個對您有用的猜測:

log = "/log?action=End&env=123&id=8000&cat=baseball\n/log?action=start&get=3210&rsa=456&key=golf"

logLines = [line.split("&") for line in log.split('\n')]
logLines = [tuple(line[0].split("=")+line[1:]) for line in logLines]

print logLines

輸出:

[('/log?action', 'End', 'env=123', 'id=8000', 'cat=baseball'), 
 ('/log?action', 'start', 'get=3210', 'rsa=456', 'key=golf')]

假設您實際上並不需要在第一個字符串的末尾加上“ =”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM