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

Python用正则匹配点开头内存段从日志提取数据生成指定格式字典

实现方案
  • 首先用正则匹配日志中所有开头带空白、后跟.开头的段名的行,提取段名和对应的Budget、Size、Prev Size、Overflow四个字段值
  • 把提取到的内容组织为嵌套字典:外层键为段名,内层键为对应的字段名,数值类字段自动转成int类型

完整可运行代码

import re
from pprint import pprint

data = '''
. 
.
.
#Long log file
 -------------------------------------------------------------------------------
 Section Name                   | Budget    | Size      | Prev Size | Overflow
 --------------------------------+-----------+-----------+-----------+----------
  .text.resident                 |    712924 |    794576 |    832688 | YES
  .rodata.resident               |     77824 |     77560 |     21496 | YES
  .data.resident                 |     28672 |     28660 |     42308 | NO
  .bss.resident                  |     52672 |   1051632 |   1455728 | YES 
  
.
.
.
  
'''

# 定义正则规则:匹配以.开头的段行,提取对应字段
pattern = re.compile(r'^\s*(\.[a-zA-Z0-9_.]+)\s*\|\s*(\d+)\s*\|\s*(\d+)\s*\|\s*(\d+)\s*\|\s*(\w+)', re.MULTILINE)
# 定义字段名,用于构造子字典
fields = ['Budget', 'Size', 'Prev Size', 'Overflow']
result_dict = {}

for match in pattern.finditer(data):
    section_name = match.group(1)
    # 提取数值字段转int,最后一个Overflow字段保留字符串
    values = [int(match.group(2)), int(match.group(3)), int(match.group(4)), match.group(5)]
    result_dict[section_name] = dict(zip(fields, values))

pprint(result_dict)

输出结果

{'.bss.resident': {'Budget': 52672,
                   'Overflow': 'YES',
                   'Prev Size': 1455728,
                   'Size': 1051632},
 '.data.resident': {'Budget': 28672,
                    'Overflow': 'NO',
                    'Prev Size': 42308,
                    'Size': 28660},
 '.rodata.resident': {'Budget': 77824,
                      'Overflow': 'YES',
                      'Prev Size': 21496,
                      'Size': 77560},
 '.text.resident': {'Budget': 712924,
                    'Overflow': 'YES',
                    'Prev Size': 832688,
                    'Size': 794576}}

正则规则说明

  • ^\s*:匹配行开头的任意数量空白字符
  • (\.[a-zA-Z0-9_.]+):捕获以.开头,后面由字母、数字、下划线、点组成的段名
  • \s*\|\s*:匹配段名和数值之间的分隔符|和前后的空白
  • (\d+):捕获数字类型的预算、大小等字段
  • (\w+):捕获最后的YES/NO状态字段
  • re.MULTILINE:开启多行模式,让^可以匹配每一行的开头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:24:03