我在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()
出现问题。但是,我想避免这种情况,因为模板实际上来自一个文件。
答案 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
,如图所示。来自该答案的代码示例(已修改)。
ldr