我正在编写一个Python脚本,它将纯文本作为输入并生成
LaTeX代码作为输出。在某些时候,脚本必须引用所有
在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
问题是{
和}
字符,因为它们可能是由早期替换(\
- &gt; \textbackslash{}
)产生的,在这种情况下不应该&#39被替换。我认为解决方案是一步完成所有替换,但我不知道该怎么做。
答案 0 :(得分: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
中。