2012-02-06 11 views
13

Tengo un archivo LaTeX que quiero leer con Python 3 y formato un valor en la cadena resultante. Algo así como:Formatee una cadena que tenga llaves adicionales

... 
\textbf{REPLACE VALUE HERE} 
... 

Pero no he sido capaz de encontrar la manera de hacer esto ya que la nueva forma de hacer la cadena de formato utiliza {val} notación y puesto que es un documento LaTeX, hay un montón de {} caracteres adicionales.

he intentado algo así como:

'\textbf{This and that} plus \textbf{{val}}'.format(val='6') 

pero me da

KeyError: 'This and that' 

Respuesta

20

Método 1, que es lo que en realidad había hago: uso una vez string.Template.

>>> from string import Template 
>>> Template(r'\textbf{This and that} plus \textbf{$val}').substitute(val='6') 
'\\textbf{This and that} plus \\textbf{6}' 

Método 2: agregar llaves adicionales. Podría hacer esto usando una expresión regular.

>>> r'\textbf{This and that} plus \textbf{val}'.format(val='6') 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
KeyError: 'This and that' 
>>> r'\textbf{{This and that}} plus \textbf{{{val}}}'.format(val='6') 
'\\textbf{This and that} plus \\textbf{6}' 

(posible) Método 3: utilice una cadena personalizada.Formatter. No he tenido motivos para hacerlo yo mismo, así que no conozco los detalles para ser útil.

+0

¿Alguna pista si string.Template estará en desuso en el futuro? El nuevo formato de python 3 {} parece incluir esto. Para la edición de LaTeX, sin embargo, las plantillas son mucho más prácticas. – levesque

+0

@levesque: Bueno, no ha quedado obsoleto a partir del (pendiente) 3.4, y ofrece una funcionalidad diferente a la del formato '{}', así que creo que se mantendrá por un tiempo. – DSM

+0

Posiblemente una forma más agradable de agregar llaves adicionales en lugar de usar una expresión regular es con 'str.translate'. 'unformatter = str.maketrans ({'{': '{{', '}': '}}'})', luego para corregir una cadena dada, 'goodstring = badstring.translate (unformatter)' (Nota: El la pregunta es sobre Python 3.x; en 2.x, esto solo funcionaría con 'unicode', no' str', porque solo 'unicode' admite mapeos de traducción 1-n). – ShadowRanger

Cuestiones relacionadas