Python解析多组同键头部字符串生成字典列表避免键值覆盖
问题根因
原有代码存在3个逻辑错误,导致无法得到预期结果:
- 目标字符串使用反斜杠做行续接,实际存储为连续单行文本,不存在
\n换行符,按换行拆分的逻辑完全无法切分内容 - 仅初始化了1个全局字典存储所有内容,相同键名的后续赋值会直接覆盖前序值,自然只会保留最后一组记录的内容
- 直接对整段文本按
:做单次拆分的逻辑不成立,连续排列的键值对会被错误切分,出现键值混杂的问题
修正代码
使用正则做分段和键值对提取,兼容格式中冒号前后空格不一致的情况:
import re header = "Type : 0 Record Size : 0x10 id : 0x1 Version : 0x1 Bas : 0x1 Size : 0x10\ Type : 0 Record Size : 0x20 id : 0x2 Version : 0x2 Bas : 0x2 Size : 0x20\ Type : 0 Record Size: 0x30 id : 0x3 Version : 0x3 Bas : 0x3 Size : 0x30" record_list = [] # 以每条记录的起始标识"Type"为分割点切分整段文本,自动跳过段间空白 for segment in re.split(r'\s+(?=Type\s*:)', header.strip()): # 正则匹配所有「键 : 值」格式的配对,兼容键名含空格、冒号前后空格数不统一的情况 kv_pairs = re.findall(r'([a-zA-Z][a-zA-Z\s]*?)\s*:\s*(\d+|0x[0-9a-fA-F]+)', segment) current_record = {key.strip(): value.strip() for key, value in kv_pairs} record_list.append(current_record)
运行结果
执行后record_list的内容和预期完全一致:
[ {'Type': '0', 'Record Size': '0x10', 'id': '0x1', 'Version': '0x1', 'Bas': '0x1', 'Size': '0x10'}, {'Type': '0', 'Record Size': '0x20', 'id': '0x2', 'Version': '0x2', 'Bas': '0x2', 'Size': '0x20'}, {'Type': '0', 'Record Size': '0x30', 'id': '0x3', 'Version': '0x3', 'Bas': '0x3', 'Size': '0x30'} ]
实现说明
- 分段逻辑使用正则正向预查,匹配
Type字段前的空白位置做切割,不会丢失每条记录的Type键值 - 键值匹配逻辑自动兼容格式差异:比如第三条记录中
Record Size: 0x30冒号前无空格,其余记录冒号前后有空格,都可以正常识别 - 每处理一条记录就新建独立字典存储,不会出现跨记录的键值覆盖问题
- 不需要额外处理字符串里续行带来的多余缩进空格,正则会自动跳过段间空白
内容的提问来源于stack exchange,提问作者manjunath K.R
相关产品推荐
相关产品推荐

