Come posso evitare selettivamente la percentuale (%) nelle stringhe di Python?


364

Ho il codice seguente

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

print(selectiveEscape)

Vorrei ottenere l'output:

Print percent % in sentence and not have it break.

Cosa succede realmente:

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

57
Perché no \%? Questa era la mia ipotesi, sono sorpreso di trovarlo %%invece - sembra piuttosto controintuitivo.
Demis,

3
% isignifica "una rappresentazione decimale di un numero intero, imbottito a sinistra con spazi.
Antti Haapala

3
L'evasione è nella funzione, non nella sintassi del linguaggio. Quindi se la fuga fosse \%effettivamente sarebbe \\%quando scritto in codice ordinario. <escape><escape>è il modello tipico che ho visto, e \sembra essere il personaggio più comune di fuga, nel bene e nel male.
shemnon,

1
@Demis e come fuggi \ se dovessi stampare \\%? Sei obbligato a scappare attraverso la ripetizione di caratteri speciali, se anche i caratteri speciali non sono speciali a seconda delle circostanze.
Sassa NF,

2
Penso che sia fastidioso in Python che il valore letterale% sia codificato da "%%" e non da "\%".
MasterControlProgram

Risposte:


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
In Python 3.3.5, print('%s%%' % 100)stampa 100%. Ma print('%%')stampe %%. Quindi sembra che non si debba sfuggire ai segni% se non si effettuano sostituzioni.
Zenadix,

5
@Zenadix Questo vale anche in Python 2.7
Tom,

2
Si noti che il %metodo è in realtà deprecato (in Python 3) a favore di str.format(): docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
Si noti che il %metodo non è ammortizzato in Python 3.6. Continuerà a essere supportato al posto della sua somiglianza con c, c ++, ecc. str.format()E le stringhe f sono preferite ma non applicate.
Aaron,

Ho appena notato che se la stringa è una stringa json, essendo letta da un file non è nemmeno necessario sfuggire al %segno. Lo %farò
vagare il

57

In alternativa, a partire da Python 2.6, è possibile utilizzare la nuova formattazione delle stringhe (descritta in PEP 3101 ):

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

che è particolarmente utile quando le corde diventano più complicate.


+1, mentre immaginavo che op stesse cercando una risposta basata sul%, preferisco di gran lunga usare formatquesti giorni.
Nolen Royalty,

2
L'unico problema è quando il testo che vuoi formattare è HTML con una sezione di stile CSS.
Broseph,

Cosa mi consigliate per la formattazione del testo HTML che contiene una sezione di stile CSS, @Broseph?
DucRP,

1
Mi sbagliavo. Se usi le doppie parentesi graffe nel tuo CSS, stai bene.
Broseph,


5

Non puoi scappare selettivamente % , come %sempre ha un significato speciale a seconda del seguente carattere.

Nella documentazione di Python, alla base della seconda tabella in quella sezione, si afferma:

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

Pertanto è necessario utilizzare:

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

(si prega di notare che il cambio esplicito su tuple come argomento per % )

Senza sapere quanto sopra, avrei fatto:

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

con la conoscenza che ovviamente avevi già avuto.


3

Se il modello di formattazione è stato letto da un file e non è possibile garantire che il contenuto raddoppi il segno di percentuale, probabilmente è necessario rilevare il carattere di percentuale e decidere a livello di codice se è l'inizio di un segnaposto o meno. Quindi il parser dovrebbe anche riconoscere sequenze come %d(e altre lettere che possono essere utilizzate), ma anche%(xxx)s ecc.

Problemi simili si possono osservare con i nuovi formati: il testo può contenere parentesi graffe.


1

Se stai usando Python 3.6 o versioni successive, puoi usare 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

Ho provato diversi metodi per stampare un titolo della trama secondaria, guarda come funzionano. È diverso quando uso Latex.

Funziona con '%%' e 'string' + '%' in un caso tipico.

Se usi Latex ha funzionato usando 'string' + '\%'

Quindi in un caso tipico:

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 + '%)')

Esempi di titoli con%

Se usiamo il lattice:

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 + '\%)')

Otteniamo questo: esempio di titolo con% e lattice

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.