我编写了一个非常难看的脚本,以便在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逃逸,这不是我想要的。
回答你的问题
使用类似于github.com/alvinwan/TexSoup的乳胶解析器,我们可以稍微简化代码。我知道OP要求使用regex,但如果OP是工具不可知的,解析器会更健壮。你知道吗
功能不错
我们可以把它抽象成一个替换函数
然后,按以下方式使用这个
replaceTex
函数演示
以下是一个基于TexSoup的独立演示:
相关问题 更多 >
编程相关推荐