我得到如下布尔表达式:
string = '!True && !(True || False || True)'
我知道eval('1+2')
会返回3
。但是当我执行eval(string)
时,它会在无效语法中抛出错误。
还有其他方法可以执行上面的表达式吗?
答案 0 :(得分:2)
!
,&&
和||
都不是有效的Python运算符; eval()
只能处理有效的Python表达式。
你必须用有效的Python版本替换这些表达式;大概!
为not
,&&
为and
,||
为or
,因此您可以更换那些Python版本:
eval(string.replace('&&', 'and').replace('||', 'or').replace('!', 'not '))
请注意not
之后的空格,因为Python需要这个空间。
更好的方法是不对这些运算符使用错误的拼写(它们看起来像Java或JavaScript或C)。
答案 1 :(得分:2)
如果要解析布尔逻辑(与控制流相反),请查看this stackoverflow post。它提到了pyparsing
pyparsing模块是创建和执行简单语法的另一种方法
和sympy。
SymPy的逻辑模块允许使用符号和布尔值来形成和操作逻辑表达式。
似乎还有parser implemented with pyparsing。
当然你也可以自己写一个解析器。