2013-02-14 41 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中。

相关问题