2012-05-21 4 views
248

Ich habe den folgenden CodeWie kann ich Prozent (%) in Python-Strings selektiv entkommen lassen?

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

print(selectiveEscape) 

Ich mag würde die Ausgabe erhalten:

Print percent % in sentence and not have it break. 

Was tatsächlich passiert:

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

@KarlKnechtel: Aber ich persönlich habe das Problem, wenn die Formatierungsvorlage aus einer Datei gelesen wurde. Wenn Sie keine Kontrolle darüber haben, was sich in der Datei befindet, ist die Frage berechtigt. – pepr

+0

Wenn sich die Formatierungsvorlage in einer Datei befindet, liegt es in der Verantwortung des Erstellers der Datei, das richtige Template zu erhalten, einschließlich der korrekten Maskierung von '%' Symbolen. –

+9

Warum ist es nicht '\ '? Das war meine Vermutung, ich bin überrascht zu finden, dass es "%%" stattdessen ist - scheint ziemlich kontraintuitiv. – Demis

Antwort

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 druckt 'print ('% s %%'% 100)' '100%'. Aber 'print ('%%')' druckt '%%'. Es sieht also so aus, als müssten Sie den% -Zeichen nicht entgehen, wenn Sie keine Ersetzungen vornehmen. – Zenadix

+3

@Zenadix Dies gilt auch für Python 2.7 und – Tom

+1

Beachten Sie, dass die '%' Methode eigentlich veraltet ist (in Python 3) zugunsten von 'str.format()': https://docs.python.org/2/ library/stdtypes.html # str.format – dantiston

46

Alternativ kann, wie von Python 2.6, Sie können eine neue Zeichenfolgenformatierung verwenden (beschrieben in PEP 3101):

was besonders praktisch ist, da Ihre Strings komplizierter werden.

+0

+1, während ich dachte, op war auf der Suche nach einer% -basierten Antwort Ich verwende viel lieber 'Format' in diesen Tagen. –

+2

Das einzige Problem dabei ist, wenn der Text, den Sie formatieren möchten, HTML mit einem CSS-Stilabschnitt ist. – Broseph

+0

Was empfehlen Sie für Textformatierung von HTML, das einen CSS-Stil-Abschnitt enthält, @Broseph? – DucRP

23

versuchen Sie mit %%% Zeichen zu drucken.

3

Wenn die Formatierungsvorlage aus einer Datei gelesen wurde und Sie nicht sicherstellen können, dass der Inhalt das Prozentzeichen verdoppelt, müssen Sie wahrscheinlich das Prozentzeichen ermitteln und programmgesteuert entscheiden, ob es sich um den Anfang eines Platzhalters handelt. Dann sollte der Parser auch Sequenzen wie %d (und andere verwendbare Buchstaben), aber auch %(xxx)s etc. erkennen.

Ähnliches Problem kann man bei den neuen Formaten beobachten - der Text kann geschweifte Klammern enthalten.

3

Sie können nicht selektiv entkommen %, wie % hat immer eine besondere Bedeutung abhängig von dem folgenden Zeichen.

Im documentation von Python, am bottem der zweiten Tabelle in diesem Abschnitt, heißt es:

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

Daher sollten Sie verwenden:

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

(bitte beachten Sie die expicit Änderung Tupel als Argument zu %)

Ohne zu wissen über das obige hätte ich getan:

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

mit dem Wissen, das Sie offensichtlich bereits hatten.