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

本文介绍如何将格式不统一(分隔符为 `;`、`:` 或空格)的字符串高效解析为键值对,并推荐使用字典而非动态变量,兼顾安全性与可维护性。

在 Python 中处理类似 'var_name; var_value var_name1; var_value1 var_name2 var_value2 var_name3: var_value3' 的字符串时,核心挑战在于:键与值之间的分隔方式不固定(可能是 ;、:,甚至仅靠空格),且键名和值均可能包含字母、数字及下划线等合法标识符字符。此时,切忌使用 exec()、globals() 或 locals() 动态创建变量——这不仅破坏作用域清晰性、引发命名冲突,更会带来严重的安全风险(如注入恶意代码)。

推荐方案是构建一个结构化、可查询的字典(dict)。以下是一个健壮、简洁的实现:

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):
        if i + 1 >= len(tokens):
            break  # 忽略孤立的键(无对应值)
        key = tokens[i].rstrip(";:")
        value = tokens[i + 1]
        result[key] = value
        i += 2
    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'}

该函数通过 split() 将字符串按空白符切分为原子 token,再以两两配对的方式遍历:对每个偶数索引的 token 去除末尾的 ; 或 : 得到干净的键名,其后一个 token 即为对应值。整个过程不依赖正则,逻辑清晰、性能良好,且天然兼容含空格的值(若需支持带空格的值,需改用更高级的解析策略,如正则匹配或自定义分词器)。

注意事项:

  • 若原始字符串存在奇数个 token(如末尾多出一个键而无值),代码会自动跳过,避免 IndexError;
  • 键名中的 ; 和 : 仅在末尾被剥离,中间字符保留(例如 'user:name' → 键 'user:name');
  • 所有值均为字符串类型;如需自动类型推断(如数字转 int/float),可在赋值前添加 ast.literal_eval() 或自定义转换逻辑;
  • 字典支持 .get(), .keys(), in 成员检测等标准操作,便于后续数据处理。

综上,用字典替代动态变量是 Python 中处理此类配置式字符串的惯用、安全且可扩展的最佳实践。