使用python解析公式

时间:2014-05-24 20:48:49

标签: python parsing formula brackets

我想使用python构建一个括号括起来的公式的解析树。

例如,

parse tree of ((x='a' OR x= 'b') AND(y ='c' OR y = 'd' )) using python

该公式不一定是正常形式。它也可以是k深度电路。

解析器还应该允许'> =','< =','!='等运算符。

对于我的目的,哪种解析器最有效/最有效?

1 个答案:

答案 0 :(得分:1)

我早早作弊,经常欺骗"那种人。下面将您的输入代码转换为Python表达式,使用常规机制解析它,然后打印出结构。

import ast, re

source = "((x='a' OR x= 'b') AND(y ='c' OR y = 'd' ))"

# turn source '=' into Python '==', unless it's part of a compound
# IE: <= >= != => =< =!
py_source = re.compile(
    r'(?<=  [^<>!]  )'
    r'='
    r'(?<=  [^<>!]  )',
    re.VERBOSE).sub('==', source.lower())

print 'SOURCE:', source
print 'PYTHON:', py_source

print ast.dump( ast.parse(py_source) )

示例输出:

SOURCE: ((x='a' OR x= 'b') AND(y ='c' OR y = 'd' ))
PYTHON: ((x=='a' or x== 'b') and(y =='c' or y == 'd' ))

Module(body=[Expr(value=BoolOp(op=And(), values=[BoolOp(op=Or(), values=[Compare(left=Name(id='x', ctx=Load()), ops=[Eq()], comparators=[Str(s='a')]), Compare(left=Name(id='x', ctx=Load()), ops=[Eq()], comparators=[Str(s='b')])]), BoolOp(op=Or(), values=[Compare(left=Name(id='y', ctx=Load()), ops=[Eq()], comparators=[Str(s='c')]), Compare(left=Name(id='y', ctx=Load()), ops=[Eq()], comparators=[Str(s='d')])])]))])