2013-02-14 84 views
3

我寫一個Python腳本,需要純文本輸入,併產生 LaTeX的代碼作爲輸出。在某些時候腳本必須引用所有在TeX中具有特殊含義的 字符,例如%,&,\等 。引號的字符串爲TeX輸入

這比我預期的更困難。目前我有這樣的:

def ltx_quote(s): 
    s = re.sub(r'[\\]', r'\\textbackslash{}', s) 
    # s = re.sub(r'[{]', r'\\{{}', s) 
    # s = re.sub(r'[}]', r'\\}{}', s) 
    s = re.sub(r'[&]', r'\\&{}', s) 
    s = re.sub(r'[$]', r'\\${}', s) 
    s = re.sub(r'[%]', r'\\%{}', s) 
    s = re.sub(r'[_]', r'\\_{}', s) 
    s = re.sub(r'[\^]', r'\\^{}', s) 
    s = re.sub(r'[~]', r'\\~{}', s) 
    s = re.sub(r'[|]', r'\\textbar{}', s) 
    s = re.sub(r'[#]', r'\\#{}', s) 
    s = re.sub(r'[<]', r'\\textless{}', s) 
    s = re.sub(r'[>]', r'\\textgreater{}', s) 
    return s 

的問題是{}字符,因爲它們潛在地通過對較早製備的取代 - 在這種情況下不應該被取代的(\>\textbackslash{})。我認爲解決方案會一步步完成所有的替換,但我不知道該怎麼做。

回答

3

也許嘗試使用無證re.Scanner

import re 
scanner = re.Scanner([ 
    (r"[\\]", r'\\textbackslash{}'), 
    (r"[{]", r'\\{{}'), 
    (r"[}]", r'\\}{}'), 
    (r".", lambda s, t: t) 
]) 

tokens, remainder = scanner.scan("\\foo\\{bar}") 
print(''.join(tokens)) 

產生

\\textbackslash{}foo\\textbackslash{}\\{{}bar\\}{} 

不像你發佈的代碼,如果你看一下the source code,該re.Scanner.scan使得只有一個通通過字符串。一旦比賽結束,下一場比賽將從上一場比賽結束時開始。

re.Scanner的第一個參數是lexicon - 一個2元組列表。每個2元組是一個正則表達式模式和一個動作。這個動作可能是一個字符串,一個可調用的函數或者None(不採取行動)。

的模式都編譯成一種化合物圖案。所以模式在詞典中的排列順序很重要。匹配勝利的第一種模式。

如果匹配,動作被稱爲如果它是可調用的,或者一個字符串僅返回。返回值收集在列表tokens中。

相關問題