2012-05-21 28 views
248

Tengo el siguiente código¿Cómo puedo escapar selectivamente el porcentaje (%) en cadenas Python?

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

print(selectiveEscape) 

me gustaría obtener la salida:

Print percent % in sentence and not have it break. 

¿Qué sucede realmente:

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

@KarlKnechtel: Pero personalmente he encontrado el problema cuando se leyó la plantilla de formateo de un archivo. Si no tiene control sobre lo que está dentro del archivo, entonces la pregunta es legítima. – pepr

+0

Si la plantilla de formateo está en un archivo, la correcta correlación de la plantilla, incluida la correcta escapada de los símbolos '%', es responsabilidad del creador del archivo. –

+9

¿Por qué no es '\%'? Esa fue mi suposición, me sorprende descubrir que es '%%' en su lugar, parece bastante contrario a la intuición. – Demis

Respuesta

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

En Python 3.3.5, 'print ('% s %%'% 100)' imprime '100%'. Pero 'print ('%%')' imprime '%%'. Entonces parece que no tiene que escapar del% de signos si no realiza sustituciones. – Zenadix

+3

@Zenadix Esto también es cierto en Python 2.7 – Tom

+1

Tenga en cuenta que el método '%' está actualmente en desuso (en Python 3) a favor de 'str.format()': https://docs.python.org/2/ library/stdtypes.html # str.format – dantiston

46

Alternativamente, a partir de Python 2.6, puede usar el nuevo formato de cadena (descrito en PEP 3101):

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

que es especialmente útil ya que sus cadenas se vuelven más complicadas.

+0

+1, mientras que pensé que op estaba buscando una respuesta basada en%, prefiero usar 'format' en estos días. –

+2

El único problema con esto es cuando el texto que desea formatear es HTML con una sección de estilo CSS. – Broseph

+0

¿Qué recomienda para el formato de texto HTML que contiene una sección de estilo CSS, @Broseph? – DucRP

23

intente utilizar %% para imprimir el signo%.

3

Si la plantilla de formateo se leyó de un archivo y no puede garantizar que el contenido dobla el signo de porcentaje, entonces probablemente tenga que detectar el carácter de porcentaje y decidir programáticamente si es el inicio de un marcador de posición o no. Entonces el analizador también debe reconocer secuencias como %d (y otras letras que se pueden usar), pero también %(xxx)s etc.

Se puede observar un problema similar con los nuevos formatos: el texto puede contener llaves.

3

No se puede escapar selectivamente a %, ya que % siempre tiene un significado especial dependiendo del siguiente carácter.

En el documentation de Python, en la bottem de la segunda tabla en esa sección, se indica:

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

lo tanto, debe utilizar:

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

(tenga en cuenta el cambio expicit a tupla como argumento a %)

Sin saber lo anterior, lo hubiera hecho:

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

con el conocimiento que obviamente ya tenías.

Cuestiones relacionadas