解析具体消息输入及原因

问题描述 投票:0回答:1

我有一个以下格式的日志文件

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 非常陌生,任何输入都可以得到所需的输出

python regex parsing
1个回答
0
投票

最简单的解决方案是使用两个表达式,每个块一个,然后数字行:

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')]
© www.soinside.com 2019 - 2024. All rights reserved.