Wie kann ich Prozent (%) in Python-Strings selektiv umgehen?


364

Ich habe den folgenden Code

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

print(selectiveEscape)

Ich möchte die Ausgabe erhalten:

Print percent % in sentence and not have it break.

Was passiert eigentlich:

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

57
Warum ist es nicht \%? Das war meine Vermutung, ich bin überrascht, dass es %%stattdessen ist - scheint ziemlich eingängig zu sein.
Demis

3
% ibedeutet "eine Dezimaldarstellung einer Ganzzahl, links mit Leerzeichen aufgefüllt.
Antti Haapala

3
Die Flucht erfolgt zur Funktion, nicht zur Sprachsyntax. Wenn also die Flucht \%wäre, wäre es tatsächlich, \\%wenn es in gewöhnlichem Code geschrieben wäre. <escape><escape>ist das typische Muster, das ich gesehen habe und das \zufällig der häufigste Fluchtcharakter ist, egal ob gut oder schlecht.
Shemnon

1
@ Demis und wie entkommst du, \ wenn du drucken musstest \\%? Sie müssen durch Wiederholung von Sonderzeichen entkommen, wenn die Sonderzeichen je nach den Umständen auch keine Sonderzeichen sind.
Sassa NF

2
Ich finde es in Python ärgerlich, dass das Literal% von "%%" und nicht von "\%" codiert wird.
MasterControlProgram

Antworten:


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

5
@ Zenadix Dies gilt auch für Python 2.7
Tom

2
Man beachte , dass das %Verfahren tatsächlich veraltet ist (in Python 3) zu Gunsten str.format(): docs.python.org/2/library/stdtypes.html#str.format
dantiston

8
Beachten Sie, dass die %Methode in Python 3.6 nicht abgeschrieben wird. Es wird weiterhin anstelle seiner Ähnlichkeit mit c, c ++ usw. unterstützt, str.format()und F-Strings werden bevorzugt, aber nicht erzwungen.
Aaron

Ich habe gerade bemerkt, dass wenn die Zeichenfolge eine JSON-Zeichenfolge ist und Sie aus einer Datei gelesen werden, Sie nicht einmal dem %Zeichen entkommen müssen . Just %will do
wander95

57

Alternativ können Sie ab Python 2.6 die neue Zeichenfolgenformatierung verwenden (beschrieben in PEP 3101 ):

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

Das ist besonders praktisch, wenn Ihre Saiten komplizierter werden.


+1, während ich dachte, dass op nach einer% -basierten Antwort sucht, bevorzuge ich formatheutzutage die Verwendung.
Nolen Royalty

2
Das einzige Problem dabei ist, wenn der zu formatierende Text HTML mit einem Abschnitt im CSS-Stil ist.
Broseph

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

1
Ich lag falsch. Wenn Sie in Ihrem CSS doppelte Klammern verwenden, geht es Ihnen gut.
Broseph


5

Sie können nicht selektiv entkommen %, da dies %abhängig vom folgenden Zeichen immer eine besondere Bedeutung hat.

In der Dokumentation von Python wird am Ende der zweiten Tabelle in diesem Abschnitt Folgendes angegeben:

'%'        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 explizite Änderung von Tupel als Argument für %)

Ohne darüber Bescheid zu wissen, hätte ich getan:

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

mit dem Wissen, das Sie offensichtlich schon hatten.


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 erkennen und programmgesteuert entscheiden, ob es der Beginn eines Platzhalters ist oder nicht. Dann sollte der Parser auch Sequenzen wie %d(und andere Buchstaben, die verwendet werden können), aber auch %(xxx)susw. erkennen.

Ein ähnliches Problem kann bei den neuen Formaten beobachtet werden - der Text kann geschweifte Klammern enthalten.


1

Wenn Sie Python 3.6 oder höher verwenden, können Sie f-string verwenden :

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

Ich habe verschiedene Methoden ausprobiert, um einen Nebenhandlungstitel zu drucken und zu sehen, wie sie funktionieren. Es ist anders, wenn ich Latex benutze.

In einem typischen Fall funktioniert es mit '%%' und 'string' + '%'.

Wenn Sie Latex verwenden, funktioniert es mit 'string' + '\%'

Also in einem typischen Fall:

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

Titelbeispiele mit%

Wenn wir Latex verwenden:

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

Wir bekommen folgendes: Titelbeispiel mit% und Latex

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.