Python dizesinde değişmez kıvırcık ayraç karakterlerini nasıl yazdırabilir ve .format kullanabilirim?


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

bana verir : Key Error: Hello\\

Çıktıyı yazdırmak istiyorum: {Hello} 42



9
Parantezleri ( {{ }}) ikiye katlamaktan kaçınmak isteyenler için kullanın string.Template. Orada formun tanımlayıcılarını değiştirirsiniz $foo(LaTeX kodu oluşturmak için kullanışlıdır).
Ioannis Filippidis

Parantezleri ikiye katlamaktan kaçınmak ve Python projelerine başka bir bağımlılık eklemekten kaçınmayanlar için , kullanıcı tanımlı özel yer tutucu sınırlayıcı sözdizimine izin vererek bu sorunu kesin olarak çözen Jinja2 de var .
dreftymac

Yanıtlar:


2066

Sen çift gerekir {{ve }}:

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

Biçim dizisi sözdizimi için Python belgelerinin ilgili kısmı :

Biçim dizeleri, süslü parantezlerle çevrili "değiştirme alanları" içerir {}. Parantez içinde bulunmayan her şey, çıktıya değişmeden kopyalanan değişmez metin olarak kabul edilir. Değişmez metne küme ayracı karakteri eklemeniz gerekiyorsa, karakter iki katına çıkarılabilir: {{ve }}.


264
Yani "{42}" yazdırmak istiyorsanız, kullanırsınız "{{{0}}}".format(42)!
Hughes

7
Tek bir kıvırcık ayraç istiyorsanız ne olacak? "{ something { } {value}".format(42)çalışmıyor.
AJP

14
"{{" .format () ve "}}". format () tek kıvırcık kaşlı ayraçları yazdırır. Örneğinizde: "{{bir şey {{}} {0}". Biçiminde (42) "{bir şey {} 42" yazdırılır.
Mark Visser

2
Ne anlama {0}geliyor?
CodyBugstein

6
@Imray: {0}ile ilgili ilk argümanı ifade eder .format(). {0} {1} {2}Aynı sayıda argüman verdiğiniz sürece birden fazla değer yazdırabilirsiniz .format(). Kapsamlı örnekler için docs.python.org/library/string.html#format-examples adresine bakın .
Greg Hewgill

74

Parantezleri iki katına çıkararak kaçıyorsunuz.

Örneğin:

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

60

Python 3.6+ (2017)

Python'un son sürümlerinde f-dizeleri kullanılır (ayrıca bkz . PEP498 ).

F-stringleri ile çift {{veya}}

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

istenileni üretir

 {Hello} 42

Değişmez metin kullanmak yerine parantez içindeki bir ifadeyi çözümlemeniz gerekiyorsa, üç parantez kümesine ihtiyacınız olacaktır:

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

üretir

{hello}

46

OP bu yorumu yazdı:

Küçük bir JSON gibi bazı amaçlar için biçimlendirmek çalışıyordum: '{"all": false, "selected": "{}"}'.format(data)gibi bir şey almak için{"all": false, "selected": "1,2"}

JSON ile uğraşırken "kaçan diş telleri" sorununun ortaya çıkması oldukça yaygındır.

Bunu yapmanızı öneririm:

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

Alternatifden daha temiz, yani:

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

jsonJSON dizesi örnekten daha karmaşık hale geldiğinde kütüphaneyi kullanmak kesinlikle tercih edilir.


1
Amin! Daha fazla iş gibi görünebilir, ancak kütüphanelerin köşeleri kesmeye karşı yapması gereken şeyleri yapmak için kütüphaneleri kullanmak daha iyi şeyler yapar.
Kaolin Ateşi

1
Ancak Python nesnesindeki anahtarların sırası garanti edilmez ... Yine de, JSON kitaplığının bir JSON biçiminde serileştirilmesi garanti edilir.
wizzwizz4

2
wizzwizz4: İyi nokta. Python 3.6'dan itibaren, sözlükler ekleme talimatı verilmiştir, bu yüzden bir sorun olmaz. Python'un 2.7 ve 3.5 arasındaki sürümleri koleksiyon kütüphanesinden OrderedDict kullanabilir.
twasbrillig

24

Bunu yapmayı deneyin:

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


14

Daha iyi olmasa da, sadece referans için bunu da yapabilirsiniz:

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

Örneğin, birisi yazdırmak istediğinde yararlı olabilir {argument}. Belki daha okunabilir'{{{}}}'.format('argument')

Python 2.7'den sonra bağımsız değişken konumlarını (örneğin {}yerine {0}) atladığınızı unutmayın.


5

Bunu çok yapacaksanız, bunun yerine rasgele ayraç yerine kullanmanıza izin verecek bir yardımcı program işlevi tanımlamak iyi olabilir.

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

Bunun parantezlerin 2 uzunluğunda bir dize olması ya da iki dizeden oluşan bir yinelemeyle çalışacağını unutmayın (çok karakterli sınırlayıcılar için).


Bunu da düşündüm. Tabii ki, bu da işe yarayacak ve algoritma daha basit. Ancak, bunun gibi bir sürü metniniz olduğunu ve bunu burada ve orada parametrelendirmek istediğinizi düşünün. Her girdi dizesi oluşturduğunuzda, tüm bu parantezleri manuel olarak değiştirmek istemezsiniz. Sadece parametrelerinizi burada ve orada 'bırakmak' istersiniz. Bu durumda, bu yöntemin hem kullanıcı açısından hem düşünülmesi hem de başarılması daha kolay olduğunu düşünüyorum. Linux'un sınırlayıcıyı uygun olana göre keyfi olarak seçmek için benzer özelliklere sahip 'sed' komutundan ilham aldım.
tvt173

Kısacası, yarar fonksiyonu her zaman kullanmak için @ $$ bir acı olması biraz daha karmaşık olmasını tercih ediyorum. Teklifinizi yanlış anladıysam lütfen bize bildirin.
tvt173

Sürece devam ettik ve benim public.lab uzay kısa demo ekledik github.com/dreftymac/public.lab/blob/master/topic/python/...
dreftymac

3

Kısa bir süre önce buna rastladım çünkü önceden biçimlendirilmiş JSON'a dizeler enjekte etmek istedim. Benim çözümüm, böyle bir yardımcı yöntem oluşturmaktı:

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

Daha sonra şöyle bir şey yapabilirsiniz:

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

Performans bir sorun değilse işi yapar.


Basit ve zarif küçük bir değişiklik gerekli mevcut kod entegre etmek. Teşekkürler!
Sütun01

2

Dizede iki kıvırcık parantez tutmanız gerekiyorsa, değişkenin her iki tarafında 5 kıvırcık parantez gerekir.

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

F telli olanlar için, her iki tarafta 5 yerine 4 kıvırcık parantez kullanın
TerryA

0

Sebep olduğu {}sözdizimi .format()sizin durumda bu yüzden .format()tanımaz {Hello}bir hata attı yüzden.

{{}} çift kıvırcık ayraç kullanarak geçersiz kılabilirsiniz,

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

veya

%smetin biçimlendirmeyi deneyin ,

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

0

Lateks belgesine yapıştırabildiğim metni yazdırmaya çalışırken bu sorunu tökezledim. Ben uzatmak bu cevap ve adlandırılmış yedek alanların marka kullanımı:

Diyelim resim açıklamasını buraya girinki, Lateks içinde $A_{ 0042 }*A_{ 3141 }*A_{ 2718 }*A_{ 0042 }$ aşağıdaki gibi çok sayıda değişken içeren bir ürünü yazdırmak istediğinizi varsayalım.

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

Yalnızca bir adet süslü ayraç yazdırmak istiyorsanız (örneğin {) kullanabilirsiniz {{ve isterseniz daha sonra dizeye daha fazla parantez ekleyebilirsiniz. Örneğin:

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

Sadece kod dizelerini enterpolasyon yapmaya çalıştığınızda Python için tam özellikli bir şablon motoru olan jinja2 kullanmanızı öneririm , yani:

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

Bu nedenle, diğer cevapların birçoğunun önerdiği gibi, kıvırcık parantezleri çoğaltmaya zorlanmayacaksınız


-3

Bunu, dizeden önce tırnak işaretleri olmadan 'r' karakteri ekleyerek raw string yöntemini kullanarak yapabilirsiniz.

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

Merhaba! Bunu tekrar kontrol etmek isteyebilirsiniz; Python 3.7 baskılar \{I am inside braces\}.
Teodor

1
@Teodor bunun için üzgünüm. Şimdi ben ham dize olarak yazdırarak bu düzeltildi.
Harsh Aggarwal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.