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
相关产品推荐
相关产品推荐

