【问题标题】:Parse a log line and store in `Pandas.DataFrame`解析日志行并存储在 `Pandas.DataFrame`
【发布时间】:2021-07-15 09:18:41
【问题描述】:

假设我有一个Pandas.DataFrame:

log_df = pd.DataFrame(columns=['type', 'ts', 'process', 'subprocess', 'num', 'message'])

和一个日志文件,其中包含以下格式的行:

ERROR:2021-04-19 08:43:10,562:trigger_manager.py:SpawnProcess-2:29:Stream has ended

我想用 : 解析它,但问题是我有 : 字符分隔时间戳字段,显然不应该解析它。

我尝试使用简单的str.split(sep=':'),这导致time-stamp 的分裂。 我想我应该使用regex,但不知道如何处理这项任务。

我将不胜感激。

提前致谢。

【问题讨论】:

  • 如果您已经尝试过正则表达式,请分享您的尝试。目前尚不清楚您如何存储和访问当前数据。
  • 我还没有使用正则表达式,正如问题中所述,我不知道如何解决这个问题,这正是我在这里问它的原因。

标签: python python-3.x regex pandas


【解决方案1】:

您可以使用.str.extract()提取日志文件内容如下:

出于测试目的,我在log_file 系列中创建了您的示例日志文件的一行数据。 您可以用您的数据替换:

log_file = pd.Series(['ERROR:2021-04-19 08:43:10,562:trigger_manager.py:SpawnProcess-2:29:Stream has ended'])

log_df = log_file.str.extract(r'(?P<type>[^:]+):(?P<ts>.+,\d+):(?P<process>[^:]+):(?P<subprocess>[^:]+):(?P<num>[^:]+):(?P<message>[^:]+)')


print(log_df)


    type                       ts             process      subprocess num           message
0  ERROR  2021-04-19 08:43:10,562  trigger_manager.py  SpawnProcess-2  29  Stream has ended

正则解释

我根据目标数据框的列名提取你的样本数据,如下:

(?P&lt;type&gt;[^:]+) 为日志 type 命名捕获组。这里[^:]匹配:以外的字符,这样我们就可以提取分隔符:之前的字符了

: 匹配分隔符 : 字面意思

(?P&lt;ts&gt;.+,\d+) 为时间戳 ts 命名捕获组,以纳秒为单位。我们可以使用.+ 代替[^:]+,因为, 在纳秒之前的特殊格式。

: 匹配分隔符: 字面意思

(?P&lt;process&gt;[^:]+)process 命名捕获组

: 匹配分隔符 : 字面意思

(?P&lt;subprocess&gt;[^:]+)subprocess 命名捕获组

: 匹配分隔符: 字面意思

(?P&lt;num&gt;[^:]+)num 命名捕获组

: 匹配分隔符: 字面意思

(?P&lt;message&gt;[^:]+)message命名的捕获组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多