1

我知道有很多关于子串的帖子,相信我,我已经搜索了很多帖子来寻找答案。

我有很多字符串,来自日志的行,我正在尝试对它们进行分类和解析。

它们看起来像这样:

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE 静态消息;动态消息

其中filename是日志所在的文件,date是消息放入日志的日期/时间,TYPE是消息的类型,然后消息由两部分组成,一个是静态部分和一个动态部分,静态部分不会因为消息而改变,而动态部分可以改变(显然),它们被 a 分割,;;动态部分可以有更多。

我希望能够提取静态消息和动态消息。

到目前为止,我一直在使用这样的东西:

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

我试过了,它在某种程度上有效,除了有时文件名可能有空格,或者类型可能有空格或某些东西不能正常工作,我有时会得到类型作为静态消息的一部分......效率是这是一个问题,因为这些是成千上万行必须每天解析和分类的日志。所以我想知道除了这个黑客工作之外是否有更好的方法来做到这一点?

编辑:我想我会在日志中提供更多行示例。为了解决我之前所说的问题,有几种类型的条目。

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE 静态消息;动态消息

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 MODULE.NAME TYPE THREAD.OR.CONNECTION.INFORMATION 静态消息;动态消息

如您所见 - 有两种类型的日志条目。那些没有模块的和那些有模块的,可以连接到连接,也可以连接到线程。这使得解析更加困难。

4

2 回答 2

1

您可以将拆分限制为第一个 ';' 只要:

static, dynamic = line.split(';', 1)

您的静态部分拆分可能需要做更多的工作,但如果您知道在第一部分中空格的数量将是静态的,那么同样的技巧可能会在那里起作用:

static = static.split(' ', 4)[-1]

如果该行的第一部分更复杂(类型部分中的空格),我担心在此之前删除所有内容将是一件更困难的事情。最好的办法是找出TYPE可以假设的有限值集,并使用带有该信息的正则表达式来拆分静态部分。

于 2012-09-03T12:21:39.313 回答
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')
于 2012-09-03T19:38:05.107 回答