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

时间:2013-10-22 23:32:18

标签: python regex parsing

我有一个日志文件的部分如下所示:

"/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')

我已经研究过正则表达式和匹配,但是我的很多日志都有不同的序列,这使我相信它是不可能的。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

这显然是URL的一个片段,因此解析它的最佳方法是使用URL解析工具。 stdlib附带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,其余内容完全相同。

答案 1 :(得分:0)

你可以拆分几次:

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']

答案 2 :(得分:0)

如果不知道可能的输入域是什么,有点难以说,但是这里有一个猜测对你有用的东西:

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')]

这假设您不需要在第一个字符串的末尾使用“=”。