2010-05-17 15 views
17

Al formatear una cadena, mi cadena puede contener un módulo "%" que no me gustaría haber convertido. Puedo escapar de la cuerda y cambiar cada "%"-"%%" como una solución.cadena de Python formato cuando cadena contiene "% s" sin escapar

por ejemplo,

'Day old bread, 50%% sale %s' % 'today!' 

de salida:

'Day old bread, 50% sale today' 

Pero hay alguna alternativa a escapar? Esperaba que el uso de un dict lo hiciera para que Python ignorara cualquier conversión que no sea de palabras clave.
por ejemplo,

'Day old bread, 50% sale %(when)s' % {'when': 'today'} 

pero Python todavía ve el primer módulo % y da una:

TypeError: not enough arguments for format string 
+2

escapar% no es una solución, que es una manera documentada y oficial de hacer esto. – SilentGhost

Respuesta

22

Se puede (y debe) utilizar el new string .format() method (si tiene Python 2.6 o superior) en su lugar:

"Day old bread, 50% sale {0}".format("today") 

The manual can be found here.

Los documentos también dicen que el antiguo formato % eventualmente se eliminará del idioma, aunque eso seguramente llevará algún tiempo. Los nuevos métodos de formateo son mucho más potentes, así que eso es una buena cosa.

+0

A menos que desee imprimir el formato "{{0}} = {0}". ("Hoy"), no querrá doblar las llaves. : ^) –

+0

@MarkTolonen Ugg, específicamente vine aquí con la esperanza de encontrar una solución al problema del formato "{{0}}" (...) ... – KSletmoe

2

En realidad, no - escapar sus signos% es el precio que paga por el uso de la cadena de formato. En su lugar, podría utilizar la concatenación de cadenas: 'Day old bread, 50% sale ' + whichday si eso ayuda ...

+0

Para donde necesito apoyar Python 2.5 o antes, este es el método Voy a usar. –

2

Escapar un '%' como '%%' no es una solución. Si usa el formato de cadena, es la forma de representar un signo '%'. Si no quiere eso, siempre puede hacer algo como:

print "Day old bread, 50% sale " + "today" 

e.g. no usando formateo.

Tenga en cuenta que al utilizar la concatenación de cadenas, asegúrese de que la variable sea una cadena (y no, por ejemplo, ninguna) o use str(varName). De lo contrario, obtienes algo como 'No se puede concatenar str y NoneType'.

2

Se pueden utilizar expresiones regulares para reemplazar% en %% donde% no es seguido por (

def format_with_dict(str, dictionary): 
    str = re.sub(r"%([^\(])", r"%%\1", str) 
    str = re.sub(r"%$", r"%%", str) # There was a % at the end? 
    return str % dictionary 

esta manera: salida

print format_with_dict('Day old bread, 50% sale %(when)s', {'when': 'today'}) 

Will:

Día de edad pan, un 50% la venta hoy

Este método es útil para evitar "No hay suficientes argumentos para el formato de cadena" errores.

Cuestiones relacionadas