我想编写并返回像[{1}}这样的Python模板字符串,以便从片段中使用"Hey {where}, {who}!"
,例如
.format()
但是template = greeting_template + ", " + appeal_template + some_text
return template
是一个从外部范围来到我的函数的变量,所以我不知道是否有任何特殊字符。 some_text
的特殊字符为.format()
和{
。
当然,我可以做到
}
然后在模板中使用some_text = some_text.replace("{", "{{").replace("}", "}}")
。但我发现它是一个糟糕的解决方案,因为它没有考虑在其他版本的Python中可能的格式化语法扩展。
那么,在使用some_text
之前,是否有任何标准函数(或其他方式,如json.dumps
用于转义JavaScript的字符串)转义字符串?
答案 0 :(得分:2)
some_text = '{brackets}'
some_text = some_text.replace("{", "{{").replace("}", "}}")
正则表达式
来自Format a string that has extra curly braces in it上的Shadowranger(仅限Python 3.x )
unformatter = str.maketrans({'{': '{{', '}': '}}'})
some_text = some_text.translate(unformatter)
结果:{{brackets}}
不确定如何在其他版本的Python中抢占这些“格式化语法的可能扩展”,所以现在似乎逃避curly brackets是您唯一关注的问题。
答案 1 :(得分:-2)
您可以使用自定义.format()来构造模板,该模板处理重复的花括号:
E.g。
import string
class FormatterWithEscapedCurlyBrackets(string.Formatter):
def convert_field(self, value, conversion):
if conversion == 'e':
return value.replace('{', '{{').replace('}', '}}')
else:
return super(FormatterWithEscapedCurlyBrackets, self).convert_field(value, conversion)
fmt = FormatterWithEscapedCurlyBrackets().format
template = fmt("{greeting}, {appeal}{some_text!e}", greeting="Hey {where}", appeal="{who}", some_text="!{brackets}")
template.format(where="here", who="you")
# or
fmt(template, where="here", who="you")