web-dev-qa-db-ja.com

どうやってpython文字列でリテラルの中括弧文字を印刷し、それに.formatを使うことができますか?

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

私にくれ:Key Error: Hello\\

出力を印刷したいのですが{Hello} 42

1153
Schitti

{{}}を2倍にする必要があります。

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

フォーマット文字列の構文に関する Pythonドキュメントの関連部分は次のとおりです

フォーマット文字列は、中括弧{}で囲まれた「置換フィールド」を含みます。中括弧に含まれていないものはすべてリテラルテキストと見なされ、そのまま出力にコピーされます。リテラルテキストに中括弧を含める必要がある場合は、{{}}を2倍にすることでエスケープすることができます。

1588
Greg Hewgill

あなたは中括弧を2倍にすることによってそれを免れる。

例えば:

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

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ライブラリを使用することをお勧めします。

30
twasbrillig

これをやってみてください。

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

これを試して:

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

22
pajton

Python 3.6+(2017)

最近のバージョンのPythonでは f-strings を使用するでしょう( PEP498 も参照)。

F文字列では、二重の{{または}}を使うべきです。

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

望ましいを作り出す

 {Hello} 42

リテラルテキストを使用する代わりに角かっこ内の式を解決する必要がある場合は、3組の角かっこが必要です。

hello = "HELLO"
print(f"{{{hello.lower()}}}")

作り出す

{hello}
22
divenex

参考までに、これ以上のことはできません。

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

たとえば、誰かが{argument}を印刷したいときに便利です。おそらく'{{{}}}'.format('argument')より読みやすいです。

Python 2.7以降では引数の位置を省略していることに注意してください(例:{}の代わりに{0}

12
George Aprilis

あなたがこれをたくさんやろうとしているなら、代わりに任意のブレース代用品を使うことを可能にする効用関数を定義するのは良いかもしれません。

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のストリング、または2つのストリングの反復可能文字(複数文字の区切り文字の場合)のどちらでも機能することに注意してください。

6
tvt173

理由は、{}.format()の構文なので、あなたの場合では.format(){Hello}を認識しないのでエラーになります。

二重中括弧{{}}を使って上書きできます。

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

または

テキストフォーマットのために%sを試してください、

x = " { Hello } %s"
print x%(42)  
1

文字列に2つの中括弧を保持する必要がある場合は、変数の両側に5つの中括弧が必要です。

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'
1
Richard

String.Template() を使用できます。

from string import Template
s = Template('$txt, $num')
s.substitute(txt='{Hello}', num='42 ')
0
Alec Alameddine