如何使用eval()计算Python字符串布尔表达式?

问题描述 投票:0回答:3

我得到如下布尔表达式:

string = '!True && !(True || False || True)'

我知道

eval('1+2')
会返回
3
。但是当我执行
eval(string)
时,它会抛出错误,因为语法无效。

还有其他方法可以执行上面的表达式吗?

python boolean
3个回答
5
投票

!
&&
||
都不是有效的Python运算符;
eval()
只能处理有效的Python表达式。

您必须将这些表达式替换为有效的 Python 版本;大概

!
not
&&
and
||
or
,所以你可以只需用 Python 版本替换它们:

eval(string.replace('&&', 'and').replace('||', 'or').replace('!', 'not '))

注意

not
后面的空格,因为 Python 需要这个。

更好的方法是不要对这些运算符使用错误的拼写(它们看起来像 Java 或 JavaScript 或 C)。


2
投票

如果您想解析布尔逻辑(与控制流相反),请查看this stackoverflow post。它提到了pyparsing

pyparsing 模块是创建和执行简单语法的另一种方法

sympy

SymPy 的逻辑模块允许使用符号和布尔值形成和操作逻辑表达式。

似乎还有一个 用 pyparsing 实现的解析器

当然你也可以自己写一个解析器。


0
投票

我最近发现了这个包: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)>)
© www.soinside.com 2019 - 2024. All rights reserved.