如何在Python中从字符串安全解析键值对并构建字典

本文介绍如何将格式不统一(分隔符为`;`、`:`或空格)的变量名-值字符串,稳健地解析为键值对字典,避免动态创建变量带来的安全与可维护性风险。

在Python中处理类似 'var_name; var_value var_name1; var_value1 var_name2 var_value2 var_name3: var_value3' 的字符串时,核心目标是提取成对的“变量名 → 值”映射。虽然技术上可通过 exec()、globals()[name] = value 或 locals() 动态创建变量,但强烈不推荐——这会破坏作用域清晰性、引发命名冲突、带来代码注入风险,且难以调试和测试。

✅ 推荐方案:使用字典(dict)作为结构化容器,既安全又灵活。关键在于正确切分并配对 token:

string = "var_name; var_value var_name1; var_value1 var_name2 var_value2 var_name3: var_value3"

def parse_key_value_pairs(s):
    tokens = s.split()
    result = {}
    i = 0
    while i < len(tokens):
        # 提取键:移除末尾可能的分隔符 ; 或 :
        key = tokens[i].rstrip(";:")
        i += 1
        # 检查是否有对应值(防止索引越界)
        if i < len(tokens):
            value = tokens[i]
            result[key] = value
            i += 1
        else:
            # 若无值,可设为 None 或跳过(根据业务需求)
            result[key] = None
    return result

data = parse_key_value_pairs(string)
print(data)
# 输出: {'var_name': 'var_value', 'var_name1': 'var_value1', 'var_name2': 'var_value2', 'var_name3': 'var_value3'}

该函数鲁棒性强:

  • 自动剥离键末尾的 ; 和 :,保留原始键名完整性;
  • 使用显式循环替代 range(0, len(tokens), 2),避免偶数/奇数 token 数量异常导致的 IndexError;
  • 支持混合分隔方式(如 key; value、key: value、key value)无缝共存。

? 进阶提示:

  • 若值本身含空格(如 'user_name; "John Doe"'),需改用正则或更高级解析器(如 shlex);
  • 如需类型自动转换(如数字转 int/float),可在赋值前添加 try/except 类型推断逻辑;
  • 解析结果字典可直接用于配置加载、参数传递或 JSON 序列化,符合 Python 最佳实践。

总之,用字典代替动态变量,是清晰、安全、可扩展的首选路径。