如何将多行拆分格式的告警日志转换为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)
关键说明
- 正则的必要性:由于Date Time和Description跨多行,必须通过正则识别每个告警的起始边界(下一个Sequence数字开头的行),才能准确拆分每个完整的告警条目,避免字段混乱。
- 模式调整:如果你的日志中AlarmId、Level的格式和示例不同(比如Level含空格),可以修改正则中对应分组的匹配规则(比如把
(\w+)改成([\w\s]+)匹配带空格的Level)。 - 字段合并:把Date Time之后的所有行用空格连接,还原完整的Description内容。
内容的提问来源于stack exchange,提问作者crist_9
相关产品推荐
相关产品推荐

