在python中使用regexp替换Latex命令



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

更具体地说,我想更改:

  • ket{(.*)}转换为|(.*)rangle
  • bra{(.*)}转换为langle(*)|

为此,我写了一个非常非常丑陋的剧本。预期用途是做这样的事情:

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

所以我做了以下几点。它是有效的,但一点也不好,我想知道你是否可以给我一个建议,即使是一个链接到正确的命令也可以。注意,我做递归是因为当我找到第一个"\ket{"时,我知道我想替换第一个出现的"}"(即,我确信"\ket{"中没有其他子命令)。但同样,这不是解析latex的正确方法。

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仅替换匹配字符串的"边界",并保持内部原样?我想保留\命令{xxx}的内容。

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

要回答您的问题,

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

使用github.com/alvinwan/TexSoup这样的latex解析器,我们可以稍微简化代码。我知道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

Demo

以下是一个基于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

最新更新