Python dizelerinde yüzde (%) oranında seçici olarak nasıl kaçabilirim?


364

Takip koduna sahibim

test = "have it break."
selectiveEscape = "Print percent % in sentence and not %s" % test

print(selectiveEscape)

Çıktı almak istiyorum:

Print percent % in sentence and not have it break.

Aslında ne olur:

    selectiveEscape = "Use percent % in sentence and not %s" % test
TypeError: %d format: a number is required, not str

57
Neden olmasın \%? Bu benim tahminimdi, %%bunun yerine bulduğuma şaşırdım - oldukça mantıksız görünüyor.
Demis

3
% ivasıtaları ", bir tamsayı, ondalık bir temsilidir, boşluklar sol yumuşak dolgulu.
Antti Haapala

3
Kaçış, dil sözdizimine değil işleve yöneliktir. Dolayısıyla kaçış \%olsaydı \\%, sıradan bir kodla yazıldığında olurdu . <escape><escape>gördüğüm tipik modeldir ve \daha iyi ya da kötü için en yaygın kaçış karakteri olur.
shemnon

1
@Demis ve \ baskı yapmak zorunda kalırsanız nasıl kaçıyorsunuz \\%? Koşullara bağlı olarak özel karakterler de özel değilse, özel karakterlerin tekrarından kaçmak zorundasınız.
Sassa NF

2
Ben literal% "\%" tarafından değil "%%" tarafından kodlanmış Python sinir bozucu olduğunu düşünüyorum.
MasterControlProgram

Yanıtlar:


625
>>> test = "have it break."
>>> selectiveEscape = "Print percent %% in sentence and not %s" % test
>>> print selectiveEscape
Print percent % in sentence and not have it break.

38
Python 3.3.5'te print('%s%%' % 100)yazdırır 100%. Ama print('%%')yazdırır %%. Yani, ikame yapmazsanız% işaretlerinden kaçmak zorunda değilsiniz.
Zenadix

5
@Zenadix Bu Python 2.7 için de geçerli
Tom

2
%Yöntemin aslında (Python 3'te) lehine kaldırıldığını unutmayın str.format(): docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
Not %yöntem Python 3.6 amortisman ayrılmamaktadır. C, c ++, vs.'ye benzerliği yerine desteklenmeye devam edecek str.format()ve f-stringler tercih edilir, ancak zorunlu değildir.
Aaron

Sadece dize bir json dizgiyse, bir dosyadan okunduğunuzda %işaretten kaçmanız bile gerekmediğini fark ettim . Just %will do
wander95

57

Alternatif olarak, Python 2.6'dan itibaren yeni dize biçimlendirmesi kullanabilirsiniz ( PEP 3101'de açıklanmıştır ):

'Print percent % in sentence and not {0}'.format(test)

bu da özellikle dizeleriniz daha karmaşık hale geldiğinden kullanışlıdır.


+1, op'un% tabanlı bir cevap aradığını düşünürken, formatbugünlerde kullanmayı çok tercih ediyorum .
Nolen Royalty

2
Bununla ilgili tek sorun, biçimlendirmek istediğiniz metnin CSS stili bölümlü HTML olması.
Broseph

@Broseph adlı bir CSS stil bölümü içeren metin biçimlendirme HTML'si için ne önerirsiniz?
DucRP

1
Ben hatalıydım. CSS'nizde çift ayraçlar kullanırsanız, sorun olmaz.
Broseph


5

Aşağıdaki karaktere bağlı %olarak %her zaman özel bir anlamı olduğu için seçici olarak kaçamazsınız .

Gelen belgeler Python, o bölümdeki ikinci tablonun bottem belirtir:

'%'        No argument is converted, results in a '%' character in the result.

Bu nedenle şunları kullanmalısınız:

selectiveEscape = "Print percent %% in sentence and not %s" % (test, )

(lütfen argüman olarak tuple olarak yapılan değişiklik değişikliğine dikkat edin %)

Yukarıdakileri bilmeden yapardım:

selectiveEscape = "Print percent %s in sentence and not %s" % ('%', test)

zaten sahip olduğunuz bilgi ile.


3

Biçimlendirme şablonu bir dosyadan okunduysa ve içeriğin yüzde işaretini iki katına çıkardığından emin değilseniz, muhtemelen yüzde karakterini algılamanız ve bir yer tutucunun başlangıcı olup olmadığına programlı olarak karar vermeniz gerekir. Daha sonra ayrıştırıcı aynı zamanda %d(ve kullanılabilen diğer harfler gibi) dizileri de tanımalıdır.%(xxx)s .

Yeni formatlarda benzer bir sorun görülebilir - metin kıvırcık ayraçlar içerebilir.


1

Eğer kullanıyorsanız Python 3.6 veya daha yeni, kullanabilirsiniz f-string :

>>> test = "have it break."
>>> selectiveEscape = f"Print percent % in sentence and not {test}"
>>> print(selectiveEscape)
... Print percent % in sentence and not have it break.

-3

Bir alt bölüm başlığı yazdırmak için farklı yöntemler denedim, nasıl çalıştıklarına bakın. Lateks kullandığımda durum farklı.

Tipik bir durumda '%%' ve 'string' + '%' ile çalışır.

Lateks kullanıyorsanız 'string' + '\%' kullanarak çalıştı

Yani tipik bir durumda:

import matplotlib.pyplot as plt
fig,ax = plt.subplots(4,1)
float_number = 4.17
ax[0].set_title('Total: (%1.2f' %float_number + '\%)')
ax[1].set_title('Total: (%1.2f%%)' %float_number)
ax[2].set_title('Total: (%1.2f' %float_number + '%%)')
ax[3].set_title('Total: (%1.2f' %float_number + '%)')

% İle başlık örnekleri

Lateks kullanırsak:

import matplotlib.pyplot as plt
import matplotlib
font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 12}
matplotlib.rc('font', **font)
matplotlib.rcParams['text.usetex'] = True
matplotlib.rcParams['text.latex.unicode'] = True
fig,ax = plt.subplots(4,1)
float_number = 4.17
#ax[0].set_title('Total: (%1.2f\%)' %float_number) This makes python crash
ax[1].set_title('Total: (%1.2f%%)' %float_number)
ax[2].set_title('Total: (%1.2f' %float_number + '%%)')
ax[3].set_title('Total: (%1.2f' %float_number + '\%)')

Bunu alıyoruz: % ve lateks içeren başlık örneği

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.