Python如何优雅清晰解析固定格式消息为指定结构化列表
固定格式消息解析方案
针对这类结构完全固定的程序生成日志,使用正则分组捕获比多次硬切split、依赖固定下标的实现更简洁鲁棒,逻辑分层清晰,也能自动适配参数数量变化的场景。
实现代码
import re # 预编译匹配规则,分组顺序完全对应目标输出结构 MSG_PATTERN = re.compile( r"^(\S+) -> (\S+) : (\S+) \[([^\]]*)\] Loop : (\S+) Par : (\S+) Par_id : (\S+)$" ) def parse_message(line: str) -> list: match = MSG_PATTERN.match(line.strip()) if not match: raise ValueError("输入消息不符合约定格式") sender, receiver, msg_name, params_raw, loop_val, par_val, par_id_val = match.groups() # 单独解析方括号内的参数列表 params = [] if params_raw.strip(): for item in params_raw.split(","): # 每个参数按冒号切分,最多切1次,兼容值里带冒号的场景 key, val = [seg.strip() for seg in item.split(":", 1)] params.append([key, val]) return [sender, receiver, msg_name, params, loop_val, par_val, par_id_val]
效果验证
用题目给出的样例测试:
test_line = 'c -> i : C_I_status [eStatus : 1, eSceEnd : 4] Loop : 0 Par : 0 Par_id : -1' print(parse_message(test_line))
输出完全匹配预期结果:
['c', 'i', 'C_I_status', [['eStatus', '1'], ['eSceEnd', '4']], '0', '0', '-1']
同时支持空参数的场景:
test_empty = 'x -> y : EmptyMsg [] Loop : 2 Par : 5 Par_id : -10' print(parse_message(test_empty)) # 输出:['x', 'y', 'EmptyMsg', [], '2', '5', '-10']
方案优势
- 无硬编码下标取值,不会因为参数数量变化导致字段错位
- 逻辑分层明确:先校验整体格式、拆分大字段块,再单独处理参数列表,可读性远高于多层split嵌套
- 兼容性强:支持参数值包含冒号、参数前后存在多余空格的场景,也能正确识别负整数、0值的尾字段
- 预编译正则的执行效率更高,适合批量处理大量消息的场景
内容的提问来源于stack exchange,提问作者Maxime Bouhadana
相关产品推荐
相关产品推荐

