我得到如下布尔表达式:
string = '!True && !(True || False || True)'
我知道
eval('1+2')
会返回3
。但是当我执行 eval(string)
时,它会抛出错误,因为语法无效。
还有其他方法可以执行上面的表达式吗?
!
、&&
和||
都不是有效的Python运算符; eval()
只能处理有效的Python表达式。
您必须将这些表达式替换为有效的 Python 版本;大概
!
是 not
,&&
是 and
,||
是 or
,所以你可以只需用 Python 版本替换它们:
eval(string.replace('&&', 'and').replace('||', 'or').replace('!', 'not '))
注意
not
后面的空格,因为 Python 需要这个。
更好的方法是不要对这些运算符使用错误的拼写(它们看起来像 Java 或 JavaScript 或 C)。
如果您想解析布尔逻辑(与控制流相反),请查看this stackoverflow post。它提到了pyparsing
pyparsing 模块是创建和执行简单语法的另一种方法
和sympy。
SymPy 的逻辑模块允许使用符号和布尔值形成和操作逻辑表达式。
似乎还有一个 用 pyparsing 实现的解析器。
当然你也可以自己写一个解析器。
我最近发现了这个包:boolean_parser。
这是建立在
pyparsing
之上的,其他人在答案中建议。
正如其文档提到,它内置了对此类操作的支持:
res = parser.parse('2525 redwood street and 34 blue avenue')
# >> The street_name is: redwood
# >> The street_name is: blue
print(res)
# >> and_(<Street (2525 redwood street)>, <Street (34 blue avenue)>)