我知道有很多关于子串的帖子,相信我已经搜索了很多人寻找答案。
我有很多字符串,来自日志的行,我正在尝试对它们进行分类和解析。
他们看起来像这样:/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE Static 消息;动态消息
其中文件名是日志所在的文件,日期是消息放入日志的日期/时间,TYPE是消息的类型,然后消息由两部分组成,静态部分和动态部分,静态部分不会因消息而改变,动态部分可以更改(显然),并且它们会被;
拆分,但动态中可能会有更多;
一部分。
我希望能够提取静态消息和动态消息。
到目前为止,我一直在使用这样的东西:parts = line.split(";")
static = parts[0]
dynamic = ";".join(parts[1:])
不是很漂亮。而且我的静态部分包含文件名,日期和类型,我不想要。所以我想我会做这样的事情:
parts = " ".join(":".join(line.split(":")[1:]).split(" ")[4:]).split(";")
static = parts[0]
dynamic = ";".join(parts[1:])
我已经尝试了,它在某种程度上有效,除了有时文件名可能有空格,或者TYPE可能有空格或某些东西无法正常工作,我有时会将TYPE作为静态消息的一部分。效率是一个问题,因为这些是数千行日志,必须每天解析和分类。所以我想知道除了这个黑客工作之外还有更好的办法吗?
编辑:我想我会在日志中提供更多行的示例。为了解决我之前所说的,有几种类型的条目。
/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE Static 消息;动态消息
/long/file/name/with.dots.and.extension:Jan 01 12:00:00 MODULE.NAME TYPE THREAD.OR.CONNECTION.INFORMATION Static 消息;动态消息
所以你可以看到 - 有两种类型的日志条目。那些没有模块和那些模块的人可以连接到连接,有些连接到线程。 这使解析更难。
答案 0 :(得分:1)
您可以将拆分限制为第一个';'只有:
static, dynamic = line.split(';', 1)
你的静态部分拆分可能需要多做一些,但是如果你知道第一部分中空格的数量是静态的,那么也许同样的技巧可以在那里工作:
static = static.split(' ', 4)[-1]
如果该行的第一部分更复杂(TYPE部分中的空格),我担心在此之前删除所有内容将会更加困难。最好的办法是找出TYPE
可以假设的有限值集,并使用带有该信息的正则表达式来分割静态部分。
答案 1 :(得分:0)
您可以尝试以下方式:
>>> regexp = re.compile("^([\/.\w]*)\:(\w{3}\s\d{2}\s\d{2}\:\d{2}\:\d{2})\s([A-Z]*)\s([\w\s]*)\;([\w\s]*)$")
>>> regexp.match(line).groups()
('/long/file/name/with.dots.and.extension', 'Jan 01 12:00:00', 'TYPE', 'Static Message', 'Dynamic Message')