Bagaimana saya bisa mencetak karakter kurawal-kurawal dalam string python dan juga menggunakan .format di atasnya?

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

memberi saya: Key Error: Hello\\

Saya ingin mencetak hasilnya: {Hello} 42

Schitti
sumber
1
Lihat juga: stackoverflow.com/questions/35574349
dreftymac
9
Bagi mereka yang ingin menghindari menggandakan kawat gigi ( {{ }}), gunakan string.Template. Di sana Anda mengganti pengidentifikasi formulir $foo(berguna untuk menghasilkan kode LaTeX).
Ioannis Filippidis
Bagi mereka yang ingin menghindari menggandakan penyangga, dan yang tidak menolak untuk menambahkan ketergantungan lain pada proyek Python mereka, ada juga Jinja2 yang secara definitif menyelesaikan masalah ini, dengan mengijinkan sintaks pembatas placeholder kustom yang ditentukan pengguna.
dreftymac

Jawaban:

2071

Anda harus menggandakan {{dan }}:

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

Inilah bagian yang relevan dari dokumentasi Python untuk sintaks string format :

String format berisi "bidang pengganti" yang dikelilingi oleh kurung kurawal {}. Apa pun yang tidak terkandung dalam kurung dianggap teks literal, yang disalin tidak berubah ke output. Jika Anda perlu memasukkan karakter kurung kurawal dalam teks literal, itu dapat dihilangkan dengan menggandakan: {{dan }}.

Greg Hewgill
sumber
264
Jadi, jika Anda ingin mencetak "{42}", Anda akan menggunakannya "{{{0}}}".format(42)!
hughes
7
Bagaimana jika Anda ingin penahan keriting tunggal? "{ something { } {value}".format(42)tidak bekerja
AJP
14
"{{" .format () dan "}}". format () cetak kurung kurawal tunggal. Dalam contoh Anda: cetak "{{something {{}} {0}". Format (42) akan mencetak "{sesuatu {} 42".
Mark Visser
2
Apa {0}artinya?
CodyBugstein
6
@Imray: {0}merujuk pada argumen pertama .format(). Anda dapat mencetak lebih dari satu nilai seperti {0} {1} {2}selama Anda memberikan jumlah argumen yang sama .format(). Lihat docs.python.org/library/string.html#format-examples untuk contoh lengkap.
Greg Hewgill
74

Anda menghindarinya dengan menggandakan kawat gigi.

Misalnya:

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

Python 3.6+ (2017)

Dalam versi terbaru Python, orang akan menggunakan f-string (lihat juga PEP498 ).

Dengan f-string kita harus menggunakan double {{atau}}

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

menghasilkan yang diinginkan

 {Hello} 42

Jika Anda perlu menyelesaikan ekspresi dalam tanda kurung alih-alih menggunakan teks literal Anda akan membutuhkan tiga set tanda kurung:

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

menghasilkan

{hello}
divenex
sumber
46

OP menulis komentar ini:

Saya mencoba memformat JSON kecil untuk beberapa tujuan, seperti ini: '{"all": false, "selected": "{}"}'.format(data)untuk mendapatkan sesuatu seperti{"all": false, "selected": "1,2"}

Sudah cukup umum bahwa masalah "pelarian kawat gigi" muncul ketika berhadapan dengan JSON.

Saya sarankan melakukan ini:

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

Ini lebih bersih daripada alternatifnya, yaitu:

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

Menggunakan jsonperpustakaan jelas lebih disukai ketika string JSON menjadi lebih rumit daripada contohnya.

twasbrillig
sumber
1
Amin! Ini mungkin tampak seperti lebih banyak pekerjaan, tetapi menggunakan perpustakaan untuk melakukan apa yang seharusnya dilakukan perpustakaan dibandingkan memotong sudut ... membuat hal-hal yang lebih baik.
Kaolin Fire
1
Tetapi urutan kunci dalam objek Python tidak dijamin ... Namun, pustaka JSON dijamin serial dengan cara JSON.
wizzwizz4
2
wizzwizz4: Poin bagus. Dari Python 3.6 dan seterusnya, kamus diperintahkan penyisipan, sehingga tidak akan menjadi masalah. Versi Python antara 2.7 dan 3.5 dapat menggunakan OrderedDict dari perpustakaan koleksi.
twasbrillig
24

Coba lakukan ini:

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

Coba ini:

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

pajton
sumber
14

Meskipun tidak lebih baik, hanya untuk referensi, Anda juga dapat melakukan ini:

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

Ini bisa bermanfaat misalnya ketika seseorang ingin mencetak {argument}. Mungkin lebih mudah dibaca daripada'{{{}}}'.format('argument')

Perhatikan bahwa Anda menghilangkan posisi argumen (misalnya, {}bukan {0}) setelah Python 2.7

George Aprilis
sumber
5

Jika Anda akan sering melakukan ini, mungkin lebih baik untuk mendefinisikan fungsi utilitas yang akan memungkinkan Anda menggunakan pengganti brace sewenang-wenang, seperti

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}'

Perhatikan bahwa ini akan berfungsi baik dengan tanda kurung menjadi string dengan panjang 2 atau iterable dari dua string (untuk pembatas multi-karakter).

tvt173
sumber
Pikirkan juga tentang itu. Tentu saja, itu akan berhasil juga dan algoritma lebih sederhana. Tapi, bayangkan Anda memiliki banyak teks seperti ini, dan Anda hanya ingin membuat parameter di sana-sini. Setiap kali Anda membuat string input, Anda tidak ingin mengganti semua kawat gigi itu secara manual. Anda hanya ingin 'memasukkan' parameterisasi Anda di sana-sini. Dalam hal ini, saya pikir metode ini lebih mudah dipikirkan dan dicapai dari perspektif pengguna. Saya terinspirasi oleh perintah 'sed' linux yang memiliki kemampuan serupa untuk secara sewenang-wenang memilih pembatas Anda berdasarkan apa yang nyaman.
tvt173
Singkatnya, saya lebih suka memiliki fungsi utilitas menjadi sedikit lebih kompleks daripada menjengkelkan di @ $$ untuk digunakan setiap kali. Tolong beri tahu saya jika saya salah memahami proposisi Anda.
tvt173
Aku telah pergi ke depan dan menambahkan demo singkat ke public.lab saya ruang github.com/dreftymac/public.lab/blob/master/topic/python/...
dreftymac
3

Saya baru-baru ini mengalami ini, karena saya ingin menyuntikkan string ke JSON yang telah diformat sebelumnya. Solusi saya adalah membuat metode pembantu, seperti ini:

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

Anda kemudian dapat melakukan sesuatu seperti:

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

Mendapat pekerjaan yang dilakukan jika kinerja tidak menjadi masalah.

Kristján Valur
sumber
Sederhana DAN anggun untuk diintegrasikan ke dalam kode yang ada dengan sedikit modifikasi yang diperlukan. Terima kasih!
Kolom01
2

Jika Anda perlu menyimpan dua kurung kurawal dalam string, Anda membutuhkan 5 kurung kurawal di setiap sisi variabel.

>>> myvar = 'test'
>>> "{{{{{0}}}}}".format(myvar)
'{{test}}'
Richard
sumber
Bagi mereka yang menggunakan f-string, gunakan 4 kurung kurawal di kedua sisi, bukan 5
TerryA
0

Alasannya, {}adalah sintaks dari .format()begitu dalam kasus .format()Anda tidak mengenali {Hello}sehingga melemparkan kesalahan.

Anda bisa menimpanya dengan menggunakan kurung kurawal ganda {{}},

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

atau

coba %sformat teks,

x = " { Hello } %s"
print x%(42)  
Mohideen bin Mohammed
sumber
0

Saya menemukan masalah ini ketika mencoba untuk mencetak teks, yang dapat saya salin tempel ke dokumen Lateks. Saya memperluas jawaban ini dan memanfaatkan bidang pengganti bernama:

Katakanlah Anda ingin mencetak produk dari variabel mulitple dengan indeks seperti masukkan deskripsi gambar di sini, yang dalam Latex akan menjadi $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$ . Kode berikut melakukan pekerjaan dengan bidang bernama sehingga untuk banyak indeks itu tetap dapat dibaca:

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

Jika Anda hanya ingin mencetak satu kurung kurawal (misalnya {) yang dapat Anda gunakan {{, dan Anda dapat menambahkan lebih banyak kurung kurawal jika Anda mau. Sebagai contoh:

>>> 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'
Luis Cabrera Benito
sumber
-1

Ketika Anda hanya mencoba menyisipkan string kode saya sarankan menggunakan jinja2 yang merupakan mesin template berfitur lengkap untuk Python, yaitu:

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))

Jadi Anda tidak akan dipaksa untuk menduplikasi kurung kurawal seperti yang disarankan oleh seluruh jawaban lainnya

BPL
sumber
-3

Anda dapat melakukan ini dengan menggunakan metode string mentah dengan hanya menambahkan karakter 'r' tanpa tanda kutip sebelum string.

# to print '{I am inside braces}'
print(r'{I am inside braces}')
Harsh Aggarwal
sumber
Halo! Anda mungkin ingin memeriksa kembali itu; Cetakan Python 3.7 \{I am inside braces\}.
Teodor
1
@ Teoror minta maaf untuk itu. Sekarang saya memperbaikinya dengan mencetak sebagai string mentah.
Harsh Aggarwal