使用正则表达式设置变量

时间:2015-11-17 00:18:29

标签: python regex

我正在使用正则表达式创建一种语言,这是我目前的代码:

    import re

    outputf=r'output (.*)'
    inputf=r'(.*) = input (.*)'
    intf=r'int (.*) = (\d)'
    floatf=r'float (.*) = (\d\.\d)'

    def check_line(line):
        outputq=re.match(outputf, line)
        if outputq:
            exec ("print (%s)" % outputq.group(1))

        inputq=re.match(inputf, line)
        if inputq:
            exec ("%s=raw_input(%s)"%(inputq.group(1), inputq.group(2)))

        intq=re.match(intf, line)
        if intq:
            exec ("%s = %s"%(intq.group(1), intq.group(2)))
            print x

        floatq=re.match(floatf, line)
        if floatq:
            exec ("%s = %s"%(floatq.group(1), floatq.group(2)))


    code=open("code.psu", "r").readlines()

    for line in code:
        check_line(line) 

所以效果很好,但在我的文件中,这是我的代码:

int x = 1
output "hi"
float y = 1.3
output x

但是当我读到第4行时,它表示变量x未定义。如何设置它以便它还可以打印变量?

1 个答案:

答案 0 :(得分:2)

当调用exec()时,可以选择传递它将使用的变量的全局和本地字典。默认情况下,它使用globals()locals()

问题是,您正在使用exec()在示例中设置x = 1之类的变量。这确实已设置,您可以在locals()中看到它。但是在你离开函数之后,那个变量就消失了。

因此,您需要在每次locals()来电后保存exec()

编辑:

当你自己回答时,我正在写这个附录,所以我想我总是发布它......

这是一个失败的简单示例(与您的示例相同的错误):

def locals_not_saved(firsttime):
    if firsttime:
        exec("x = 1")
    else:
        exec("print(x)")

locals_not_saved(True)
locals_not_saved(False)

这是一个修改后的版本,通过将locals()保存为函数的属性来保存和重用def locals_saved(firsttime): if not hasattr(locals_saved, "locals"): locals_saved.locals = locals() if firsttime: exec("x = 1", globals(), locals_saved.locals) else: exec("print(x)", globals(), locals_saved.locals) locals_saved(True) locals_saved(False) - 这只是一种方法,YMMV。

site.com/search/?action=search&description=My Search here&e_author=