Pythonの文字列でリテラルの中括弧文字を印刷し、それに.formatを使用するにはどうすればよいですか?


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

私に与える: Key Error: Hello\\

出力を印刷したい: {Hello} 42


1
次も参照してください:stackoverflow.com/questions/35574349
dreftymac

9
中括弧({{ }})の二重化を避けたい場合は、を使用してくださいstring.Template。そこで、フォームの識別子を置き換えます$foo(LaTeXコードの生成に便利です)。
Ioannis Filippidis

中括弧の二重化を避けたい場合や、Pythonプロジェクトに別の依存関係を追加することを嫌がらない場合のために、ユーザー定義のカスタムプレースホルダー区切り記号構文を許可することにより、この問題を確実に解決するJinja2もあります。
dreftymac

回答:


2071

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

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

以下は、フォーマット文字列構文に関するPythonドキュメントの関連部分です。

書式文字列には、中括弧で囲まれた「置換フィールド」が含まれています{}。ブレースに含まれていないものはすべてリテラルテキストと見なされ、変更されずに出力にコピーされます。ブレース文字をリテラルテキストに含める必要がある場合は、二重にしてエスケープすることができます:{{}}


264
したがって、「{42}」を印刷する場合は、"{{{0}}}".format(42)
ヒューズ2013

7
中括弧が1つ必要な場合はどうでしょうか。 "{ something { } {value}".format(42)動作しません。
AJP 2013年

14
"{{" .format()および "}}"。format()は、単一の中括弧を出力します。あなたの例では:print "{{something {{}} {0}"。format(42)は "{something {} 42"を出力します。
Mark Visser 2013年

2
どういう{0}意味ですか?
CodyBugstein 14

6
@Imray:{0}への最初の引数を参照し.format()ます。{0} {1} {2}と同じ数の引数を指定する限り、同様に複数の値を出力できます.format()。広範な例については、docs.python.org / library / string.html#format-examplesをご覧ください。
Greg Hewgill、2014


60

Python 3.6以降(2017)

最近のバージョンのPythonでは、f-stringsを使用していました(PEP498参照)。

f-stringsでは、double {{または}}

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

望ましい

 {Hello} 42

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

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

作り出す

{hello}

46

OPはこのコメントを書いた:

私はこのように、いくつかの目的のために小さなJSONをフォーマットしようとしていた:'{"all": false, "selected": "{}"}'.format(data)のような何かを得るために{"all": false, "selected": "1,2"}

JSONを処理するときに「エスケープブレース」の問題が発生することはごく一般的です。

私はこれを行うことをお勧めします:

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

それは、代替案よりもきれいです:

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

jsonJSON文字列が例よりも複雑になる場合は、ライブラリを使用することをお勧めします。


1
アーメン!それはより多くの仕事のように思えるかもしれませんが、ライブラリーを使用して、ライブラリーが行うことになっていることを行うのではなく、隅を切ります...より良いものを作ります。
カオリン火災

1
しかし、Pythonオブジェクトのキーの順序は保証されていません...それでも、JSONライブラリはJSONの方法でシリアル化されることが保証されています。
wizzwizz4

2
wizzwizz4:いいですね。Python 3.6以降、辞書は挿入順になっているため、問題はありません。2.7と3.5の間のバージョンのPythonでは、コレクションライブラリのOrderedDictを使用できます。
twasbrillig

24

これを試してください:

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


14

良くはありませんが、参考までに、これを行うこともできます。

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

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

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


5

これを頻繁に行う場合は、代わりに任意のブレース置換を使用できるようにするユーティリティ関数を定義するとよいでしょう。

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つの文字列の反復可能文字(複数文字の区切り文字の場合)で機能することに注意してください。


それについても考えました。もちろん、それも機能し、アルゴリズムはより単純です。しかし、このようなテキストがたくさんあり、それをあちこちでパラメータ化したいとします。入力文字列を作成するたびに、それらすべての波括弧を手動で置き換えたくありません。あちこちにパラメータ設定を「ドロップイン」したいだけです。この場合、この方法は、ユーザーの観点から考えることも、実現することも簡単だと思います。私は、便利なものに基づいて区切り文字を任意に選択する同様の機能を持つLinuxの「sed」コマンドに触発されました。
tvt173 16

つまり、ユーティリティ関数は、@ $$を毎回使うのが面倒になるよりも少し複雑にしたいのです。あなたの提案を誤解した場合はお知らせください。
tvt173 16

私は先に進んで、短いデモをpublic.labスペースに追加しました。github.com
dreftymac /

3

事前にフォーマットされたJSONに文字列を挿入したかったため、最近これに遭遇しました。私の解決策は、次のようなヘルパーメソッドを作成することでした。

def preformat(msg):
    """ allow {{key}} to be used for formatting in text
    that already uses curly braces.  First switch this into
    something else, replace curlies with double curlies, and then
    switch back to regular braces
    """
    msg = msg.replace('{{', '<<<').replace('}}', '>>>')
    msg = msg.replace('{', '{{').replace('}', '}}')
    msg = msg.replace('<<<', '{').replace('>>>', '}')
    return msg

その後、次のようなことができます:

formatted = preformat("""
    {
        "foo": "{{bar}}"
    }""").format(bar="gas")

パフォーマンスに問題がない場合に、ジョブを完了します。


シンプルかつエレガントで、ほとんど変更を加えることなく既存のコードに統合できます。ありがとう!
Column01

2

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

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

F-文字列を使用してそれらのために、側面の代わりに5のいずれかに4つの中括弧使用
TerryA

0

理由は、{}の構文です.format()ので、あなたのケースで.format()は認識されない{Hello}ので、エラーをスローしました。

二重中かっこ{{}}を使用して上書きできます。

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

または

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

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

0

テキストを印刷しようとしたときにこの問題に遭遇しました。これをLatexドキュメントにコピーして貼り付けることができます。私はこの答えを拡張し、名前付き置換フィールドを利用します:

たとえばここに画像の説明を入力してください、Latex $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$ では次のようなインデックスを持つ複数の変数の積を出力したいとします 。次のコードは、名前付きフィールドを使用してジョブを実行するため、多くのインデックスで読みやすくなります。

idx_mapping = {'i1':42, 'i2':3141, 'i3':2178 }
print('$A_{{ {i1:04d} }} * A_{{ {i2:04d} }} * A_{{ {i3:04d} }} * A_{{ {i1:04d} }}$'.format(**idx_mapping))

-1

あなたがしたい場合にのみ(例えば1つの中括弧を印刷{)を使用でき{{、あなたがしたい場合は、後で文字列に多くの括弧を追加することができます。例えば:

>>> f'{{ there is a curly brace on the left. Oh, and 1 + 1 is {1 + 1}'
'{ there is a curly brace on the left. Oh, and 1 + 1 is 2'

-1

コード文字列を補間するだけの場合は、Python用のフル機能のテンプレートエンジンであるjinja2を使用することをお勧めします。

from jinja2 import Template

foo = Template('''
#include <stdio.h>

void main() {
    printf("hello universe number {{number}}");
}
''')

for i in range(2):
    print(foo.render(number=i))

したがって、他の答えの束全体が示唆するように、中括弧を複製することを強制されません


-3

これを行うには、文字列の前に引用符なしで文字「r」を追加するだけで、生の文字列メソッドを使用します。

# to print '{I am inside braces}'
print(r'{I am inside braces}')

こんにちは!あなたはそれを再確認したいかもしれません。Python 3.7が印刷し\{I am inside braces\}ます。
テオドール

1
@Teodor申し訳ありません。これを生の文字列として出力することで修正しました。
Harsh Aggarwal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.