如何用Python正确替换JSON占位符?解决大括号转义异常问题
解决Python中含CDATA的XML字符串占位符替换问题
你遇到的问题根源在于str.format()的大括号转义规则:{{会被解析为单个{,}}会被解析为单个}。如果原始XML字符串中CDATA段内的占位符是用双大括号包裹的(比如{{database}}),调用format(database="testDB")后,就会把{{database}}转换成{testDB},这就是不符合预期的原因。
下面是几种针对性的解决方法:
方法1:调整原始字符串的占位符写法
如果XML中没有其他需要保留的大括号,直接把占位符写成单大括号形式:
# 原始XML字符串,占位符用单大括号 original_xml = '<some_tag><![CDATA[{"database":"{database}"}]]></some_tag>' # 执行替换 result = original_xml.format(database="testDB")
执行后结果为:
<some_tag><![CDATA[{"database":"testDB"}]]></some_tag>
如果XML中存在需要保留的大括号(比如JSON结构里的固定大括号),则把需要保留的大括号用双大括号包裹,要替换的占位符仍用单大括号:
# 保留{static_key},替换{database} original_xml = '<some_tag><![CDATA[{"fixed_key":{{static_value}}, "database":"{database}"}]]></some_tag>' result = original_xml.format(database="testDB")
执行后结果为:
<some_tag><![CDATA[{"fixed_key":{static_value}, "database":"testDB"}]]></some_tag>
方法2:改用字符串替换(无需调整原始字符串)
如果无法修改原始XML字符串的占位符格式(比如从外部文件读取的内容就是{{database}}),直接用str.replace()替换目标占位符:
original_xml = '<some_tag><![CDATA[{"database":"{{database}}"}]]></some_tag>' result = original_xml.replace("{{database}}", "testDB")
这种方式跳过str.format()的转义逻辑,直接替换字符串片段,结果符合预期。
方法3:批量处理多占位符(适用于大量双大括号占位符场景)
如果有多个双大括号包裹的占位符,可以先统一将{{和}}转换为单大括号,再用format()批量替换:
original_xml = '<some_tag><![CDATA[{"database":"{{database}}", "username":"{{username}}"}]]></some_tag>' # 先转换双大括号为单大括号 processed_xml = original_xml.replace("{{", "{").replace("}}", "}") # 批量替换占位符 result = processed_xml.format(database="testDB", username="admin")
注意:这种方法仅适用于所有双大括号都是占位符的场景,如果XML中存在需要保留的双大括号结构,请勿使用。
内容的提问来源于stack exchange,提问作者Deritha
相关产品推荐
相关产品推荐

