2012-02-06 22 views
13

Mam plik LaTeX, który chcę odczytać za pomocą Pythona 3 i sformatować wartość w wynikowym łańcuchu. Coś jak:Formatowanie ciągu zawierającego dodatkowe nawiasy klamrowe

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

Ale nie byłem w stanie dowiedzieć się, jak to zrobić, ponieważ nowy sposób robienia formatowanie ciąg wykorzystuje {val} notacji i ponieważ jest to dokument LaTeX, istnieje mnóstwo dodatkowych {} znaków.

Próbowałem coś takiego:

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

ale mam

KeyError: 'This and that' 

Odpowiedz

20

metoda 1, która jest co bym faktycznie: zamiast używać 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}' 

Metoda 2: dodać dodatkowe szelki. Można to zrobić za pomocą wyrażeń regularnych.

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

(możliwe) Metoda 3: użyj niestandardowego ciągu.Format. Nie miałem powodu robić tego sam, więc nie wiem wystarczająco dużo szczegółów, aby być pomocnym.

+0

Dowolna wskazówka, czy string.Template będzie przestarzałe w przyszłości? Nowe formatowanie python 3 {} wydaje się to obejmować. W przypadku edycji LaTeX szablony są jednak znacznie wygodniejsze. – levesque

+0

@levesque: Cóż, nie jest ono przestarzałe od czasu (w toku) 3.4, i oferuje inną funkcjonalność niż formatowanie '{}', więc myślę, że będzie się utrzymywał przez jakiś czas. – DSM

+0

Prawdopodobnie lepszym sposobem na dodanie dodatkowych nawiasów klamrowych niż użycie regex jest użycie 'str.translate'. 'unformatter = str.maketrans ({'{': '{{', '}': '}}'})', a następnie, aby naprawić dany ciąg, 'goodstring = badstring.translate (unformatter)' (Uwaga: Pytanie dotyczy Pythona 3.x, w wersji 2.x działałoby to tylko z 'unicode', a nie' str', ponieważ tylko 'unicode' obsługuje odwzorowania translacji 1-n.) – ShadowRanger

Powiązane problemy