我有一个日志文件的部分如下所示:
"/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')
我已经研究过正则表达式和匹配,但是我的很多日志都有不同的序列,这使我相信它是不可能的。有什么建议吗?
答案 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')]
这假设您不需要在第一个字符串的末尾使用“=”。