python - 非常具体的子串检索和分割

标签 python logging substring

我知道有大量关于子字符串的帖子,相信我,我已经搜索了其中许多帖子来寻找这个问题的答案。

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

它们看起来像这样:

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE Static Message;Dynamic Message

其中filename是日志所在的文件,date是消息放入日志的日期/时间,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:])

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

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

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 TYPE Static Message;Dynamic Message

/long/file/name/with.dots.and.extension:Jan 01 12:00:00 MODULE.NAME TYPE THREAD.OR.CONNECTION.INFORMATION Static Message;Dynamic Message

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

最佳答案

您可以将分割限制为第一个“;”仅:

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

你的静态部分分割可能需要更多的工作,但是如果你知道第一部分中的空格数将是静态的,也许同样的技巧可以在那里工作:

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

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

关于python - 非常具体的子串检索和分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12247651/

相关文章:

algorithm - 子串搜索算法(很大的大海捞针,很小的针)

R - 根据模式和条件删除字符串列中的子字符串

java - 检查一个字符串是否是另一个字符串的子字符串

python - 在 BeautifulSoup/Python 中选择具有特定属性的标签

JavaEE : Strange behavior when implement logging

r - R : Catch errors and continue execution after logging the stacktrace (no traceback available with tryCatch)

linux - grep/touch -mtime 检查最近 XX 分钟内的日志

python - 用 pandas 计算比率

python - 改变 python 描述符

python - 尽管有种子,Numpy 仍产生不同的随机数