0

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

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

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

4

3 回答 3

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,只需将 更改urlparseurllib.parse,其余部分完全相同。

于 2013-10-22T23:37:41.020 回答
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']
于 2013-10-22T23:40:26.767 回答
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')]

这假设您实际上并不需要第一个字符串末尾的“=”。

于 2013-10-22T23:41:18.210 回答