在python中使用regexp替换Latex命令

2024-06-25 06:11:47 发布

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

我编写了一个非常难看的脚本,以便在python中解析某些行的latex并进行字符串替换。我在这里是因为我想写一些值得骄傲的东西,并学习:P

更具体地说,我想改变一下:

  • \ket{(.*)}变成|(.*)\rangle
  • \bra{(.*)}变成\langle(*)|

为此,我写了一个非常难看的剧本。预期用途是这样做:

cat file.tex | python script.py > new_file.tex

所以我做了以下几点。它的工作,但不是很好,我想知道你是否可以给我一个建议,甚至链接到正确的命令使用是可以的。请注意,我执行递归是因为当我找到第一个“\ket{”时,我知道我要替换第一个出现的“}”(即,我确定“\ket{”中没有其他子命令)。但是,这不是解析乳胶的正确方法。你知道吗

def recursion_ket(string_input, string_output=""):
    match = re.search("\ket{", string_input)
    if not match:
        return string_input
    else:
        string_output = re.sub(r"\\ket{", '|', string_input, 1)
        string_output_second =re.sub(r"}", "\rangle", stringa_output.split('|', 1)[1],  1)
        string_output = string_output.split('|', 1)[0]+string_output_second
        string_output=recursion_ket(string_output, string_output)
    return string_output

if __name__ == '__main__':
    with open(sys.argv[1]) as f:
        content=f.readlines()
        new=[]
        for line in content:
            new.append(ricorsione_ket(line))
        z=open(sys.argv[2], 'w')
        for i in new:
            z.write(i.replace("\r", '\\r').replace("\b", '\\b'))
            z.write("")

我知道这很难看。这绝对不是正确的方法。可能是因为我来自perl,不习惯python regexp。你知道吗

  • 第一个问题:是否可以使用regexp仅仅替换匹配字符串的“border”,并保持内部不变?我想保留\command{xxx}的内容。

  • 第二个问题:显然,当我试图在终端或文件中打印每个字符串时,我需要确保\r没有被解释为回车符。我试过用自动逃生器,但这不是我需要的。它用另一个\n逃逸,这不是我想要的。


Tags: 方法字符串命令renewinputoutputstring
1条回答
网友
1楼 · 发布于 2024-06-25 06:11:47

回答你的问题

  • 第一个问题:您可以使用(命名的)组
  • 第二个问题:在Python3中,可以使用r“\btree”优雅地处理反斜杠。你知道吗

使用类似于github.com/alvinwan/TexSoup的乳胶解析器,我们可以稍微简化代码。我知道OP要求使用regex,但如果OP是工具不可知的,解析器会更健壮。你知道吗

功能不错

我们可以把它抽象成一个替换函数

def replaceTex(soup, command, replacement):
    for node in soup.find_all(command):
        node.replace(replacement.format(args=node.args))

然后,按以下方式使用这个replaceTex函数

>>> soup = TexSoup(r"\section{hello} text \bra{(.)} haha \ket{(.)}lol")
>>> replaceTex('bra', r"|{args[0]}\rangle")
>>> replaceTex('ket', r"\langle{args[0]}|")
>>> soup
\section{hello} text \langle(.)| haha |(.)\ranglelol

演示

以下是一个基于TexSoup的独立演示:

>>> import TexSoup
>>> soup = TexSoup(r"\section{hello} text \bra{(.)} haha \ket{(.)}lol")
>>> soup
\section{hello} text \bra{(.)} haha \ket{(.)}lol
>>> soup.ket.replace(r"|{args[0]}\rangle".format(args=soup.ket.args))
>>> soup.bra.replace(r"\langle{args[0]}|".format(args=soup.bra.args))
>>> soup
\section{hello} text \langle(.)| haha |(.)\ranglelol

相关问题 更多 >