You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多行拆分格式的告警日志转换为Pandas DataFrame?

解决方案:用正则表达式处理多行告警日志转DataFrame

这种跨多行拆分字段的场景,正则表达式是非常合适的工具——它能精准识别每个完整告警条目的边界,把分散在多行的Date Time和Description字段合并提取。以下是基于你现有代码的完整实现:

完整代码

import pandas as pd
import re

# 读取日志文件并预处理
f = open("log.log", "r")
lineas = f.readlines()
f.close()

# 删除无效行
indexes_to_be_removed = [0, 1, 2, 4, -2, -1]
for idx in sorted(indexes_to_be_removed, reverse=True):
    del lineas[idx]

# 去除每行首尾空白
lineas = [linea.strip() for linea in lineas]

# 合并所有行成单字符串,便于正则匹配
concatened = '\n'.join(lineas)

# 正则模式:匹配完整的告警条目(含跨多行的Date Time和Description)
# 模式说明:
# (\d+)          匹配Sequence数字
# ([A-Z0-9-]+)   匹配AlarmId(如ALM-001格式)
# (\w+)          匹配Level(如Critical/Warning)
# ([\s\S]+?)     非贪婪匹配后续所有内容,直到下一个告警开头或文本结束
pattern = r'(\d+)\s+([A-Z0-9-]+)\s+(\w+)\s+([\s\S]+?)(?=\n\d+\s+[A-Z0-9-]+\s+\w+|$)'
matches = re.findall(pattern, concatened)

# 提取并整理字段
data = []
for seq, alarm_id, level, rest_content in matches:
    # 拆分Date Time(第一行)和Description(剩余行合并)
    content_lines = rest_content.strip().split('\n')
    date_time = content_lines[0].strip()
    description = ' '.join([line.strip() for line in content_lines[1:]])
    data.append([seq, alarm_id, level, date_time, description])

# 转换为Pandas DataFrame
df = pd.DataFrame(data, columns=['Sequence', 'AlarmId', 'Level', 'Date Time', 'Description'])
print(df)

关键说明

  1. 正则的必要性:由于Date Time和Description跨多行,必须通过正则识别每个告警的起始边界(下一个Sequence数字开头的行),才能准确拆分每个完整的告警条目,避免字段混乱。
  2. 模式调整:如果你的日志中AlarmId、Level的格式和示例不同(比如Level含空格),可以修改正则中对应分组的匹配规则(比如把(\w+)改成([\w\s]+)匹配带空格的Level)。
  3. 字段合并:把Date Time之后的所有行用空格连接,还原完整的Description内容。

内容的提问来源于stack exchange,提问作者crist_9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:10:32