我有一个以下格式的日志文件
Reason for message suspend
Msgx
Msgy
日志=
REASON1
MSG1 117 62.575 1440
REASON2
MSG1 1 0.027 0
MSG2 444 0.199 10
MSG3 839 0.167 1
REASON3
MSG4 117 62.575 1440
REASON4
MSG1 1 0.027 0
MSG5 444 0.199 10
MSG4 839 0.167 1
....
....
....
我想返回所有原因,msg1 对,即返回所有原因和消息暂停
REASON1
MSG1 117 62.575 1440
REASON2
MSG1 1 0.027 0
REASON4
MSG1 1 0.027 0
有没有有效的方法来解析它们?我对 python 非常陌生,任何输入都可以得到所需的输出
最简单的解决方案是使用两个表达式,每个块一个,然后数字行:
import regex as re
data = """
REASON1
MSG1 117 62.575 1440
REASON2
MSG1 1 0.027 0
MSG2 444 0.199 10
MSG3 839 0.167 1
REASON3
MSG4 117 62.575 1440
REASON4
MSG1 1 0.027 0
MSG5 444 0.199 10
MSG4 839 0.167 1
"""
block_pattern = re.compile(r'^\s+(REASON\d+).+?(?=^\s*$|\Z)', re.M | re.S)
msg_pattern = re.compile(r'^\s+MSG1\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)$', re.M)
for block in block_pattern.finditer(data):
numbers = msg_pattern.findall(block.group(0))
if numbers:
print(block.group(1))
print(numbers)
这将为您的示例生成:
REASON1
[('117', '62.575', '1440')]
REASON2
[('1', '0.027', '0')]
REASON4
[('1', '0.027', '0')]