Python解析表达式并替换为另一个表达式

Python解析表达式并替换为另一个表达式,python,regex,python-2.7,pyparsing,Python,Regex,Python 2.7,Pyparsing,我使用的是pyparsing,为了解析一些文本,我创建了一个语法,它可以像预期的那样工作,但是,对于这样的表达式: OR(OR(in1, in2), in3) 我想将嵌套表达式替换为“别名”,然后为此别名创建一个表达式,简单地说: # I have this expression ( OR(OR(in1, in2), in3) ) # Which I parsed to parsed = ["OR", [["OR", ["in1", "in2"]], "in3"]] # I want to

我使用的是
pyparsing
,为了解析一些文本,我创建了一个语法,它可以像预期的那样工作,但是,对于这样的表达式:

OR(OR(in1, in2), in3)
我想将嵌套表达式替换为“别名”,然后为此别名创建一个表达式,简单地说:

# I have this expression ( OR(OR(in1, in2), in3) )
# Which I parsed to
parsed = ["OR", [["OR", ["in1", "in2"]], "in3"]]

# I want to have
exp1 = ["OR", ["in1", "in2"]]
exp2 = ["OR", ["exp1", "in3"]]

这是一个最小的例子,但是我可以有任何嵌套的“表达式”(只有两个参数)。有办法做到这一点吗?

这里有一个可能与您编写的解析器类似的解析器:

import pyparsing as pp

LPAR, RPAR = map(pp.Suppress, "()")
OR = pp.Keyword("OR")
term = pp.pyparsing_common.identifier

or_expr = pp.Forward()
or_expr <<= pp.Group(OR + pp.Group(LPAR + pp.delimitedList(or_expr | term)) + RPAR)
运行此解析器时,创建的结果不是重要的部分。重要的是解析时生成的
exprs
列表:

or_expr.parseString(sample)

# generate assignments for each nested OR expr
for name, expr in exprs:
    print("{} = {}".format(name, expr))
这使得:

exp1 = ['OR', ['in1', 'in2']]
exp2 = ['OR', ['exp1', 'in3']]
现在我看了看,然后问,“我如何知道从输入解析的
'exp1'
与表示解析表达式的
'exp1'
之间的区别。如果这被解释为Python赋值,它应该是:

exp2 = ['OR', [exp1, 'in3']]
变量名周围没有引号

为此,我们需要从parse操作返回一个对象,该对象将
repr
作为名称,不带引号。如下所示:

class ExprName:
    def __init__(self, name):
        self._name = name
    def __repr__(self):
        return self._name
将解析操作中的return语句更改为:

return ExprName(expr_name)
现在生成的输出如下所示:

exp1 = ['OR', ['in1', 'in2']]
exp2 = ['OR', [exp1, 'in3']]

现在您可以区分生成的
expN
vars和解析的输入。

Wow,它工作起来很有魅力,我不知道pyparsing是如此强大,我正在考虑遍历解析树来获得表达式,这实际上实现了我首先想要的,那就是从底部到根获得有序的表达式我有一个还有一个问题,当我没有嵌套表达式时会发生什么?因为我不想在我有一个简单表达式(如OR(in1,in2))时替换名称。这会发生吗?我认为我的测试不会这样做(请看我答案中发布的输出)。
exp1 = ['OR', ['in1', 'in2']]
exp2 = ['OR', [exp1, 'in3']]