如何在Python中实现等效Ansible Template的功能?
实现JSON字典中%var%格式变量的批量替换
核心逻辑
递归遍历JSON加载后的字典(或列表)的每个元素,对字符串类型的值使用正则匹配%var%格式的占位符,并用给定的变量字典完成批量替换,支持嵌套结构。
完整实现代码
import json import re def do_some_magic(payload, variables): # 匹配%var%格式的占位符,捕获变量名 var_regex = re.compile(r'%(\w+)%') def traverse_and_replace(item): if isinstance(item, str): # 替换所有匹配的占位符,未找到的变量保留原格式 return var_regex.sub(lambda match: variables.get(match.group(1), match.group(0)), item) elif isinstance(item, dict): # 递归处理字典的每个键值对 return {key: traverse_and_replace(value) for key, value in item.items()} elif isinstance(item, list): # 递归处理列表的每个元素 return [traverse_and_replace(element) for element in item] # 非字符串/字典/列表类型直接返回 return item return traverse_and_replace(payload) # 示例使用流程 if __name__ == "__main__": # 1. 从JSON文件加载原始payload with open("your_payload.json", "r", encoding="utf-8") as f: raw_payload = json.load(f) # 2. 定义需要替换的变量集合 replacement_vars = { "app_name": "user_auth_service", "max_conn": "100", "log_path": "/var/log/app.log" } # 3. 执行批量替换 processed_payload = do_some_magic(raw_payload, replacement_vars) # 4. 输出或保存处理后的结果 print(json.dumps(processed_payload, indent=2, ensure_ascii=False))
关键细节说明
- 正则适配:默认正则
%(\w+)%仅匹配字母、数字和下划线组成的变量名,如果需要支持含特殊字符的变量,可修改为%([^%]+)%(匹配任意非%的字符) - 容错处理:如果变量字典中没有对应key,会保留原占位符;若需要抛出异常或替换为空,可修改
variables.get(...)部分的逻辑 - 嵌套支持:自动处理字典和列表的嵌套结构,深层的占位符也能被正确替换
内容的提问来源于stack exchange,提问作者Alpha123
相关产品推荐
相关产品推荐

