Python高级字符串格式化及自定义占位符?
Python高级字符串格式化及自定义占位符?
此问题已经有了答案:
我有一个Python变量中的下面HTML模板:
template = """ 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}}
,其中传递的字典不包含值。也就是说,我只想替换某些占位符,而不是所有出现在模板中的占位符。
编辑2:要实现我想要的效果,我可以先使用正则表达式抓取所有的占位符,然后格式化它们的内容,最后在模板中进行替换。但我想知道是否存在更简单的解决方案。
编辑3:有人建议我拆分模板,以避免使用format()
时出现问题。然而,我想避免这样做,因为模板实际上来自文件。
忘记正则表达式和预处理。您应该将模板分解,以便变量部分不在与部分相同的字符串中。
head = """ """ template = """ {head} Success rate is {value:.2%} percent. """
最后,我想避免 .format(...) 在模板包含占位符(例如{{dont_want_this_substituted}})时产生的错误,对于这些占位符,传递的字典不包含值。也就是说,我只想替换特定的占位符,而不是所有出现在模板中的占位符。
这可能有点hacky,但您可以使用 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') ) )
简单的预处理你的模板。例如,如果你想使用[[...]]
作为你的模板标记,并保留单个的{
和}
字符:
template = """ Success rate is [[value:.2%]] percent. """ result = template.replace("{", "{{").replace("}", "}}").replace("[[", "{").replace("]]", "}").format(value=0.8675309)
尝试使用不同数量的花括号来完成所有工作是很困难的,所以我肯定会使用其他字符。但是要小心,像[[
和]]
这样的字符可以出现在合法的JavaScript代码中。最好使用永远不会出现的字符。