TeX inpu的引号字符串

2024-09-19 23:34:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Python脚本,它将纯文本作为输入并生成 将代码作为输出。在某些时候,脚本必须引用所有 在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{})产生的,在这种情况下不应该被替换。我认为解决办法是一步到位,但我不知道怎么做。你知道吗


Tags: 代码文本re脚本def字符quotetex
1条回答
网友
1楼 · 发布于 2024-09-19 23:34:34

或许可以尝试使用未记录的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的第一个参数是一个lexicon二元组列表。每个2元组是一个正则表达式模式和一个动作。操作可以是字符串、可调用(函数)或None(无操作)。你知道吗

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

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

相关问题 更多 >