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



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


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

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}

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.


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)


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


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


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.


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

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)  

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

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

-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


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.