Python高级字符串格式化及自定义占位符?

8 浏览
0 Comments

Python高级字符串格式化及自定义占位符?

此问题已经有了答案

如何在使用 .format(或 f-string)时转义字符串中的大括号({})字符?

我有一个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()时出现问题。然而,我想避免这样做,因为模板实际上来自文件。

admin 更改状态以发布 2023年5月21日
0
0 Comments

忘记正则表达式和预处理。您应该将模板分解,以便变量部分不在与 """ 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') ) )

0
0 Comments

简单的预处理你的模板。例如,如果你想使用[[...]]作为你的模板标记,并保留单个的{}字符:

template = """
    
    Success rate is [[value:.2%]] percent.
"""
result = template.replace("{", "{{").replace("}", "}}").replace("[[", "{").replace("]]", "}").format(value=0.8675309)

尝试使用不同数量的花括号来完成所有工作是很困难的,所以我肯定会使用其他字符。但是要小心,像[[]]这样的字符可以出现在合法的JavaScript代码中。最好使用永远不会出现的字符。

0