题 如何在python字符串中打印文字大括号字符并在其上使用.format?


x = " \{ Hello \} {0} "
print x.format(42)

给我 : Key Error: Hello\\

我想打印输出: {Hello} 42


930
2018-03-29 00:04


起源


也可以看看: stackoverflow.com/questions/35574349 - dreftymac
对于那些想要避免倍增括号的人({{ }}), 使用 string.Template。在那里你替换表格的标识符 $foo (方便生成LaTeX代码)。 - Ioannis Filippidis


答案:


你需要加倍 {{ 和 }}

>>> x = " {{ Hello }} {0} "
>>> print x.format(42)
' { Hello } 42 '

这是相关部分 用于格式字符串语法的Python文档

格式字符串包含由大括号括起的“替换字段” {}。大括号中未包含的任何内容都被视为文本文本,它将不加改变地复制到输出中。如果你需要在文字文本中包含一个大括号字符,它可以通过加倍来转义: {{ 和 }}


1270
2018-03-29 00:08



因此,如果您想要打印“{42}”,则可以使用 "{{{0}}}".format(42) ! - hughes
如果你想要一个大括号怎么样? "{ something { } {value}".format(42) 不起作用。 - AJP
“{{”。format()和“}}”。format()打印单个花括号。在您的示例中:print“{{something {{}} {0}”。format(42)将打印“{something {} 42”。 - Mark Visser
什么是 {0} 意思? - CodyBugstein
@Imray: {0} 指的是第一个参数 .format()。您可以打印多个值 {0} {1} {2} 只要你给出相同数量的参数 .format()。看到 docs.python.org/library/string.html#format-examples 广泛的例子。 - Greg Hewgill


你通过加倍括号来逃避它。

例如:

x = "{{ Hello }} {0}"
print x.format(42)

52
2018-03-29 00:08





试着这样做:

x = " {{ Hello }} {0} "
print x.format(42)

24
2018-03-29 00:08





尝试这个:

x = "{{ Hello }} {0}"


20
2018-03-29 00:08





OP写了这样的评论:

I was trying to format a small JSON for some purposes, like this: '{"all": false, "selected": "{}"}'.format(data) to get something like {"all": false, "selected": "1,2"}

在处理JSON时出现“逃避大括号”问题是很常见的。

我建议这样做:

import json
data = "1,2"
mydict = {"all": "false", "selected": data}
json.dumps(mydict)

它比替代品更清洁,它是:

'{{"all": false, "selected": "{}"}}'.format(data)

使用 json 当JSON字符串比示例更复杂时,库绝对是首选。


19
2018-06-06 18:59



阿门!这看起来似乎更多的工作,但使用库来做库应该做的事情而不是偷工减料......这样可以做得更好。 - Kaolin Fire
但是不能保证Python对象中键的顺序......但是,JSON库保证以JSON方式进行序列化。 - wizzwizz4
wizzwizz4:好点。从Python 3.6开始,字典是按顺序排列的,因此它不会成为问题。 2.7和3.5之间的Python版本可以使用集合库中的OrderedDict。 - twasbrillig


虽然没有更好,仅供参考,您也可以这样做:

>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42

例如,当有人想要打印时,它可能很有用 {argument}。它可能比可读性更强 '{{{}}}'.format('argument')

请注意,您省略了参数位置(例如 {} 代替 {0})在Python 2.7之后


9
2017-11-05 11:22





Python 3.6(2017)

在当前版本的Python中可以使用 F-串 (也可以看看 PEP498)。

还有f-strings,应该使用double {{ 要么 }}

n = 42  
print(f" {{Hello}} {n} ")

产生所需的

 {Hello} 42

7
2017-12-21 11:12





如果你要做很多事情,最好定义一个实用函数,它可以让你使用任意的替代支撑,比如

def custom_format(string, brackets, *args, **kwargs):
    if len(brackets) != 2:
        raise ValueError('Expected two brackets. Got {}.'.format(len(brackets)))
    padded = string.replace('{', '{{').replace('}', '}}')
    substituted = padded.replace(brackets[0], '{').replace(brackets[1], '}')
    formatted = substituted.format(*args, **kwargs)
    return formatted

>>> custom_format('{{[cmd]} process 1}', brackets='[]', cmd='firefox.exe')
'{{firefox.exe} process 1}'

请注意,这将使用括号为长度为2的字符串或两个字符串的可迭代(对于多字符分隔符)。


4
2017-11-29 23:43



也想到了这一点。当然,这也会起作用,算法也更简单。但是,假设你有很多这样的文字,你只想在这里和那里参数化。每次创建输入字符串时,您都不希望手动替换所有这些大括号。你只想在这里和那里“插入”参数化。在这种情况下,我认为这种方法更容易从用户的角度思考和完成。我受到linux的'sed'命令的启发,该命令具有类似的功能,可以根据方便的选择任意选择分隔符。 - tvt173
简而言之,我宁愿让实用程序功能稍微复杂一点,而不是每次都使用@ $$的痛苦。如果我误解了你的主张,请告诉我。 - tvt173
我已经开始为我的public.lab空间添加了一个简短的演示 github.com/dreftymac/public.lab/blob/master/topic/python/... - dreftymac
我喜欢。编辑了我上面的回复。 - tvt173