Python标准函数在.format()之前转义字符串?

时间:2016-09-23 12:16:19

标签: python string

我想编写并返回像[{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的字符串)转义字符串?

2 个答案:

答案 0 :(得分:2)

some_text = '{brackets}'
  1. OP的方法
  2. some_text = some_text.replace("{", "{{").replace("}", "}}")

    1. 正则表达式

    2. 来自Format a string that has extra curly braces in it上的Shadowranger(仅限Python 3.x

    3. 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")