处理Python中的行连续和转义字符

juzqafwq  于 2023-06-25  发布在  Python
关注(0)|答案(1)|浏览(155)

我正在使用从Nuke捕获的Python代码,Nuke是一个合成软件,它添加了行延续和转义字符。用户在Nuke输入的代码如下:

if nuke.frame()>1:
   ret=nuke.frame()/2
else:
   ret=nuke.frame()

要检索此代码(存储在Nuke中的节点旋钮中),我使用Nuke的Python API中的expression()方法,下面是一个示例:

animation_curve = n['multiply'].animation(0)
code_string = animation_curve.expression()

生成的代码字符串如下所示:

[python -execlocal if\ nuke.frame()>1:\n\ \ \ ret=nuke.frame()/2\nelse:\n\ \ \ ret=nuke.frame()]

然后通过regex模式匹配,我只捕获代码:

if\ nuke.frame()>1:\n\ \ \ ret=nuke.frame()/2\nelse:\n\ \ \ ret=nuke.frame()

我的目标是使用Python中的ast模块解析和执行这个代码字符串,同时考虑到行的延续和转义字符。但是,由于行连续字符后面的意外字符引起的语法错误,我遇到了一些困难。当我尝试tree = ast.parse(code_string)时,我得到:

if\ nuke.frame()>1:\n\ \ \ ret=nuke.frame()/2\nelse:\n\ \ \ ret=nuke.frame()
                                                                               ^
SyntaxError: unexpected character after line continuation character

请注意,我可能无法使用.replace()来消除代码中的反斜杠,因为某些代码中实际上可能有反斜杠。由于安全风险,我也不能使用exec()。
我很感激任何见解、建议或代码示例,它们可以指导我正确地解析和执行从Nuke的动画表达式中获得的Python代码。感谢您的宝贵帮助!

klh5stk1

klh5stk11#

这里的诀窍是,你有空格用反斜杠"\ "转义,而ast包不喜欢它们。我相信我们可以手动把它们剥离出来,事情应该会有希望。
尝试:

import ast

text = "if\ nuke.frame()>1:\n\ \ \ ret=nuke.frame()/2\nelse:\n\ \ \ ret=nuke.frame()"
parser = ast.parse(text.replace("\ ", " "))  # <---- Take care of the escaped spaces
walker = ast.walk(parser)
print(list(walker))

相关问题