3

我正在编写一个 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

问题在于{and}字符,因为它们可能是由较早的替换 ( \-> \textbackslash{}) 产生的,在这种情况下不应该被替换。我认为解决方案是一步完成所有替换,但我不知道该怎么做。

4

1 回答 1

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\\}{}

与您发布的代码不同,如果您查看源代码,则 re.Scanner.scan 仅通过字符串一次。一旦进行了一场比赛,下一场比赛将从上一场比赛结束的地方开始。

第一个参数re.Scannerlexicon- 一个 2 元组列表。每个 2 元组都是一个正则表达式模式和一个动作。动作可以是字符串、可调用(函数)或None(无动作)。

这些模式都被编译成一个复合模式。因此,模式在词典中列出的顺序很重要。第一个匹配的模式获胜。

如果进行了匹配,则如果该操作是可调用的,则调用该操作,或者如果是字符串则仅返回该操作。返回值收集在列表中tokens

于 2013-02-14T13:04:31.563 回答