使用自定义占位符的高级Python字符串格式?

时间:2015-12-11 01:54:54

标签: python string-formatting string-interpolation

我在Python变量中有以下HTML模板:

template = """
    <script>
        function work()
        {
            alert('bla');
        }
    </script>

    Success rate is {value:.2%} percent.
"""

我想用{value:.2%}替换一些带有适当格式的十进制数字。由于我的模板可能包含大量JavaScript代码,因此我希望避免使用{{}}转义大括号,因此不能直接使用template.format(...)

使用Template(template).substitute(...)似乎也不可能,因为我需要value的高级格式。

我可能会使用相应的{value:.2%}语法替换%(value)...,然后使用template % ...。但我并不喜欢这种语法,因为实际模板中的大多数变量都不需要高级格式化,所以我想保持占位符语法简单。

所以我的问题是,是否可以在模板中使用自定义占位符,以便在必要时进行高级格式化,即只包含{{value}}[[value]]以及{{value:.2%}}[[value:.2%]]

编辑最后,我希望避免.format(...)在模板包含占位符(例如{{dont_want_this_substituted}})时会产生的错误,而传递的字典并没有这样做。 t包含一个值。也就是说,我只想替换某些占位符,而不是替换模板中出现的所有占位符。

编辑2:为了实现我想要的目标,我可以首先使用正则表达式获取所有占位符,然后格式化其内容,最后在模板中进行替换。但我想知道是否存在更简单的解决方案。

编辑3:建议我拆分模板以避免format()出现问题。但是,我想避免这种情况,因为模板实际上来自一个文件。

2 个答案:

答案 0 :(得分:1)

只需预处理模板即可。例如,如果您希望[[...]]成为模板标记,并且仅保留单个{}字符:

template = """
    <script>
        function work()
        {
            alert('bla');
        }
    </script>

    Success rate is [[value:.2%]] percent.
"""

result = template.replace("{", "{{").replace("}", "}}").replace("[[", "{").replace("]]", "}").format(value=0.8675309)

尝试使用不同数量的大括号来完成所有操作都很棘手,所以我肯定会使用其他一些字符。但是,谨慎的是,[[]]之类的内容可能合理地出现在合法的JavaScript代码中。可能更好地使用永远不可能的东西。

答案 1 :(得分:0)

忘记正则表达式和预处理。您应该分解模板,以便变量部分与collections.defaultdict部分不在同一个字符串中。

from collections import defaultdict

my_csv = '{optional[first]},{optional[middle]},{optional[last]}'
print( my_csv.format( optional=defaultdict(str, first='John', last='Doe') ) )
  

最后,我想避免.format(...)在模板包含占位符时产生的错误,例如{{dont_want_this_substituted}},传递的字典不包含值。也就是说,我只想替换某些占位符,而不是替换模板中出现的所有占位符。

可能很麻烦,但您可以使用postition: absolute,如图enter image description here所示。来自该答案的代码示例(已修改)。

ldr