.format() 字符串,如果没有可用的匹配项,则保留大括号

And*_*eas 0 python

我尝试使用大括号格式化字符串,如下所示:

dct_mapper = dict(a=1)
s = '{key1: value2, key1: value2}; attrib1={a}; attrib2={b}'
s.format(**dct_mapper)

Results in:
# KeyError: 'key1'

Expected:
# '{key1: value2, key1: value2}; attrib1=1; attrib2={b}'
Run Code Online (Sandbox Code Playgroud)

另一个限制是我需要.format_map()稍后再次使用输出,这会搞砸使用 .format() 的解决方案,因为输出大括号会消失。

我尝试了collections包中的 defaultdict 以及.format_map(),然后使用正则表达式尝试用其他括号替换括号,这感觉不太像一个解决方案,更像是一个黑客,如果你有多个,也不起作用字符串开头重复括号。

它不是 json 字符串,因为这样我就可以使用 json 库来映射值。

有谁知道如何解决这个问题?

我目前正在考虑使用循环,str.replace('{a}', 1)但这也感觉很笨拙。

Jon*_*609 5

如果您不想转换{}{{}},我建议您使用Templatefrom string。它的界面允许您自定义格式选项,如下所示:

from string import Template


class MyTemplate(Template):
    delimiter = ""


dct_mapper = dict(a=1)
s = MyTemplate('{key1: value2, key1: value2}; attrib1={a}; attrib2={b}')
print(s.safe_substitute(**dct_mapper))
Run Code Online (Sandbox Code Playgroud)

输出如您所愿: {key1: value2, key1: value2}; attrib1=1; attrib2={b}

说明:默认情况下,我Template使用$var而不是格式化字符串{var},因此我将变量名称(在 后面)的模式更改$为,${var}并将分隔符本身更改为“”,因此{var}代替 就足够了${var}

此外,模板safe_substitute允许您仅格式化整个字符串中的少数变量,并且不会因不存在的变量格式而引发错误。

另外,如果您更喜欢这个而不是那个,s.safe_substitute(**dct_mapper)可以更改为。s.safe_substitute(dct_mapper)