
本文介绍如何将格式不统一(分隔符为 `;`、`:` 或空格)的字符串高效解析为键值对,并推荐使用字典而非动态变量,兼顾安全性与可维护性。
在 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 即为对应值。整个过程不依赖正则,逻辑清晰、性能良好,且天然兼容含空格的值(若需支持带空格的值,需改用更高级的解析策略,如正则匹配或自定义分词器)。
注意事项:
立即学习“Python免费学习笔记(深入)”;
- 若原始字符串存在奇数个 token(如末尾多出一个键而无值),代码会自动跳过,避免 IndexError;
- 键名中的 ; 和 : 仅在末尾被剥离,中间字符保留(例如 'user:name' → 键 'user:name');
- 所有值均为字符串类型;如需自动类型推断(如数字转 int/float),可在赋值前添加 ast.literal_eval() 或自定义转换逻辑;
- 字典支持 .get(), .keys(), in 成员检测等标准操作,便于后续数据处理。
综上,用字典替代动态变量是 Python 中处理此类配置式字符串的惯用、安全且可扩展的最佳实践。










