2012-05-21 2 views
248

Ho il seguente codiceCome posso sfuggire in modo selettivo percentuale (%) nelle stringhe Python?

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

print(selectiveEscape) 

desidero ottenere il risultato:

Print percent % in sentence and not have it break. 

Cosa accade realmente:

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

@KarlKnechtel: Ma ho incontrato personalmente il problema quando il modello di formattazione è stato letto da un file. Se non hai il controllo su cosa c'è dentro il file, allora la domanda è legittima. – pepr

+0

Se il modello di formattazione si trova in un file, quindi ottenere il modello corretto, inclusa la corretta escaping dei simboli '%', è responsabilità del creatore del file. –

+9

Perché non è '\%'? Questa è stata la mia ipotesi, sono sorpreso di trovare '%%' invece - sembra piuttosto controintuitivo. – Demis

risposta

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

In Python 3.3.5, 'print ('% s %%'% 100)' stampa '100%'. Ma 'print ('%%')' stampa '%%'. Quindi sembra che tu non debba sfuggire ai segni% se non fai le sostituzioni. – Zenadix

+3

@Zenadix Questo vale anche per Python 2.7 – Tom

+1

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

46

alternativa, come in Python 2.6, puoi utilizzare la nuova formattazione per le stringhe (descritta in PEP 3101):

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

che è particolarmente utile in quanto le stringhe diventano più complicate.

+0

+1, mentre ho pensato che op stava cercando una risposta basata su% Preferisco di gran lunga usare 'format' in questi giorni. –

+2

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

+0

Che cosa consigliate per la formattazione del testo HTML che contiene una sezione di stile CSS, @Broseph? – DucRP

23

provare a utilizzare %% per stampare il segno%.

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 percentuale e decidere a livello di codice se è l'inizio di un segnaposto o meno. Quindi il parser dovrebbe riconoscere sequenze come %d (e altre lettere che possono essere utilizzate), ma anche %(xxx)s ecc.

Un simile problema può essere osservato con i nuovi formati: il testo può contenere parentesi graffe.

3

Non è possibile scappare selettivamente %, poiché % ha sempre un significato speciale a seconda del carattere seguente.

Nel documentation di Python, al bottem della seconda tabella in quella sezione, essa afferma:

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

Pertanto si dovrebbe usare:

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

(si prega di notare il cambiamento expicit a tupla come argomento a %)

Senza sapere quanto sopra, avrei fatto:

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

con le conoscenze che ovviamente avete già avuto.