x = " \{ Hello \} {0} "
print(x.format(42))
私に与える:Key Error: Hello\\
出力を印刷したい:{Hello} 42
x = " \{ Hello \} {0} "
print(x.format(42))
私に与える:Key Error: Hello\\
出力を印刷したい:{Hello} 42
とを2倍にする必要があり{{
ます}}
:
>>> x = " {{ Hello }} {0} "
>>> print(x.format(42))
' { Hello } 42 '
フォーマット文字列構文に関するPythonドキュメントの関連部分は次のとおりです。
フォーマット文字列には、中括弧で囲まれた「置換フィールド」が含まれています
{}
。中括弧に含まれていないものはすべてリテラルテキストと見なされ、変更されずに出力にコピーされます。リテラルテキストに中括弧文字を含める必要がある場合は、:{{
とを2倍にすることでエスケープできます}}
。
中かっこを2倍にすることでそれを回避します。
例えば:
x = "{{ Hello }} {0}"
print(x.format(42))
OPはこのコメントを書きました:
'{"all": false, "selected": "{}"}'.format(data)
私は次のようないくつかの目的のために小さなJSONをフォーマットしようとしていました:{"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文字列が例よりも複雑になる場合は、ライブラリを使用することをお勧めします。
これを試して:
x = "{{ Hello }} {0}"
これを試してみてください:
x = " {{ Hello }} {0} "
print x.format(42)
{
文字列を次の文字でフォーマットしたい}
あなたはそれらを2倍にする必要があります。
{
とのフォーマットf'{{'
_}
f'}}'
それで :
name = "bob"
print(f'Hello {name} ! I want to print }} and {{')
出力:
こんにちはボブ!}と{を印刷したい
これ以上良いわけではありませんが、参考のために、これを行うこともできます。
>>> x = '{}Hello{} {}'
>>> print x.format('{','}',42)
{Hello} 42
たとえば、誰かが印刷したい場合に便利です{argument}
。多分それはより読みやすいです'{{{}}}'.format('argument')
Python 2.7以降では、引数の位置を(たとえば{}
ではなく)省略していることに注意してください。{0}
文字列に2つの中括弧を保持する必要がある場合は、変数の両側に5つの中括弧が必要です。
>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'
f-magicを適用する文字列の部分にのみf-stringsを使用し、リテラルで「unsafe」特殊文字を含む可能性のあるすべてのものに通常の(ダム)文字列を使用することで、中括弧を2倍にする必要がなくなります。文字。複数の文字列を積み重ねるだけで、Pythonに文字列の結合を実行させます。
number = 42
print(" { Hello }"
f" {number} "
"{ thanks for all the fish }")
### OUTPUT:
{ Hello } 42 { thanks for all the fish }
注:文字列間の改行は必要ありません。読みやすくするために追加しただけです。以下に示すように、上記のコードを書くこともできます。
⚠️警告:これにより、目を傷つけたり、めまいを起こしたりする可能性があります。
print("{Hello}"f"{number}""{thanks for all the fish}")
これを頻繁に行う場合は、代わりに任意のブレース置換を使用できるユーティリティ関数を定義するとよいでしょう。
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つのストリングの反復可能(複数文字の区切り文字の場合)のいずれかで機能することに注意してください。
事前にフォーマットされた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")
パフォーマンスが問題にならない場合は、ジョブを完了させます。
key = "FOOBAR"
print(f"hello {{{key}}}")
出力
hello {FOOBAR}
誰かがfstringsを使用して中括弧内に何かを印刷したい場合に備えて。
私はこのパーティーに途方もなく遅れています。次のように、置換要素にブラケットを配置することに成功しています。
print('{0} {1}'.format('{hello}', '{world}'))
印刷する
{hello} {world}
厳密に言えば、これはOPが求めているものではありません。これは、フォーマット文字列に中括弧が必要なためですが、これは誰かに役立つ可能性があります。
fstring値の挿入を防ぐために、double{{}}を使用しました。
たとえば、Postgres UPDATEステートメントを使用して、{}の式を使用して配列をキャプチャする整数配列列を更新します。
ポート='{100,200,300}'
fstringsで、
ports = [1,2,3]
query = f"""
UPDATE table SET ports = '{{{ports}}}' WHERE id = 1
"""
実際のクエリステートメントは、
UPDATE table SET ports = '{1,2,3}'
これは有効なpostgressatementです
中括弧の片面だけを印刷する場合:
a=3
print(f'{"{"}{a}')
>>> {3
理由は、{}
の構文である.format()
ため、あなたの場合.format()
は認識されない{Hello}
ため、エラーがスローされました。
二重中括弧{{}}を使用してオーバーライドできます。
x = " {{ Hello }} {0} "
また
%s
テキストの書式設定を試してください、
x = " { Hello } %s"
print x%(42)
「引用符の壁」を使用して、フォーマットされた文字列部分を通常の文字列部分から分離できます。
から:
print(f"{Hello} {42}")
に
print("{Hello}"f" {42}")
より明確な例は
string = 10
print(f"{string} {word}")
出力:
NameError: name 'word' is not defined
次に、次のように引用ウォールを追加します。
string = 10
print(f"{string}"" {word}")
出力:
10 {word}
テキストを印刷しようとしたときにこの問題に遭遇しました。テキストをコピーして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つだけ印刷する場合(たとえば{
)、を使用でき{{
ます。必要に応じて、文字列の後半に中括弧を追加できます。例えば:
>>> 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'
フォーマット可能なf-stringテンプレート内に中括弧が必要な場合は、f-stringの中括弧のセット内に2つの中括弧を含む文字列を出力する必要があります。
css_template = f"{{tag}} {'{{'} margin: 0; padding: 0;{'}}'}"
for_p = css_template.format(tag="p")
# 'p { margin: 0; padding: 0;}'
または、ブラケット自体をパラメータ化するだけですか?おそらく非常に冗長です。
x = '{open_bracket}42{close_bracket}'.format(open_bracket='{', close_bracket='}')
print(x)
# {42}
コード文字列を補間しようとしている場合は、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))
したがって、他の多くの回答が示唆しているように、中括弧を複製するように強制されることはありません
これを行うには、文字列の前に引用符なしで文字「r」を追加するだけで、生の文字列メソッドを使用できます。
# to print '{I am inside braces}'
print(r'{I am inside braces}')
エスケープシーケンスを使用して、f文字列の中括弧をエスケープします。例:print(f'{a = {1}}')