【发布时间】:2018-07-27 17:08:13
【问题描述】:
相关:
您使用花括号 ({•••}) 来表示要格式化的字符串部分。如果您想使用文字大括号字符以便它们被.format() 忽略,您可以使用双大括号({{•••}})。 MCVE:
string = "{format} {{This part won't be formatted. The final string will have literal curly braces here.}}"
print string.format(format='string')
如果您有一个.format()s 链,则每次使用.format() 时,大括号的数量都会增加一倍。最后一个被 4 个大括号包围,并在最终输出中以文字花括号结束。 MCVE:
string = "{format1} {{format2}} {{{{3rd one won't be formatted. The final string will have literal curly braces here.}}}}"
print string.format(format1='string1').format(format2='string2')
也可以将另一个格式字符串格式化为格式字符串。最后一个被 4 个大括号包围,并在最终输出中以文字花括号结束。 MCVE:
string = "{format1} {{{{3rd one won't be formatted. The final string will have literal curly braces here.}}}}"
print string.format(format1='{format2}').format(format2='string')
当您根据运行时确定的条件使用.format()s 链时,就会出现问题。如果您希望将一组花括号作为文字字符进行转义,您使用多少个? MCVE:
string = "{} {{{{{{Here I don't know exactly how many curly braces to use because this string is formatted differently due to conditions that I have no control over.}}}}}}"
if fooCondition:
string = string.format('{} bar')
if barCondition:
string = string.format('{} baz')
if bazCondition:
string = string.format('{} buzz')
string = string.format('foo')
print string
字符串的第一部分有 4 个可能的输出:
-
foo -
foo bar -
foo baz bar -
foo buzz baz bar
字符串的第二部分以不同数量的花括号结尾,具体取决于True 的条件数。我希望第二部分的花括号永久转义,例如 每次调用 .format() 时都不会“脱落一层”。我可以像这样解决问题,MCVE:
string = "{} {{DRY - Don't repeat yourself!}}"
if fooCondition:
string = string.format('{} bar').replace("{DRY - Don't repeat yourself!}", "{{DRY - Don't repeat yourself!}}")
if barCondition:
string = string.format('{} baz').replace("{DRY - Don't repeat yourself!}", "{{DRY - Don't repeat yourself!}}")
if bazCondition:
string = string.format('{} buzz').replace("{DRY - Don't repeat yourself!}", "{{DRY - Don't repeat yourself!}}")
string = string.format('foo')
print string
But that's duplicate code (bad practice).
MCVE 不是我真正的代码。我的真实代码在 Google App Engine 网络服务器上运行。它超级长而且复杂。我正在处理字符串中的 HTML、CSS 和 JavaScript。我想通过.format() 将内容插入到 HTML 中,而不会弄乱 CSS 和 JS 的花括号。我当前的实现是不可扩展的并且非常容易出错。我必须管理多达 5 个连续的花括号(例如:{{{{{•••}}}}})才能通过 .format() 链不受影响。我需要定期将大括号重新插入未格式化固定次数的字符串中。修复这个意大利面条代码的优雅方法是什么?
如何在 Python 格式字符串中永久转义大括号?
【问题讨论】:
-
您永远不应该使用字符串格式来生成代码。使用适当的模板语言。
-
您可以在问题中永久提供相关代码。
-
那你的问题太宽泛了
-
那我不知道我们能提供什么帮助。
-
您的输入和预期输出是什么?你如何在字符串上使用
format()?如果我们不知道细节,我们无能为力。
标签: python python-2.7 escaping string-formatting python-2.x