能否针对输入集对Python布尔表达式进行求值?
Python布尔表达式求值方案
针对你的需求,有几种可靠的实现方式,以下是具体方案:
1. 直接使用eval()函数(简单高效,适合可信场景)
eval()可以直接执行字符串形式的布尔表达式,只需传入变量的布尔值映射即可。如果输入的"一组变量"指的是这些变量为True,其余未提及的为False,可以封装成辅助函数简化操作:
def evaluate_bool_expr(expr, true_vars): # 提取表达式中的所有变量 import re all_vars = set(re.findall(r'\b[A-Za-z_][A-Za-z0-9_]*\b', expr)) # 构建变量字典:指定变量为True,其余为False var_map = {var: var in true_vars for var in all_vars} return eval(expr, {}, var_map) # 测试你的示例 expr = "(A and B) or (C and D)" # 输入(A,B,C):这三个变量为True,其余为False print(evaluate_bool_expr(expr, {"A", "B", "C"})) # 输出 True # 输入(B,C,E):这三个变量为True,其余为False print(evaluate_bool_expr(expr, {"B", "C", "E"})) # 输出 False
注意:eval()会执行任意Python代码,仅当表达式和变量来源完全可信时使用,避免注入风险。
2. 使用ast模块(安全可控,适合不可信场景)
如果表达式来源不确定,用ast模块先解析并验证表达式结构,只允许布尔运算和变量引用,避免执行危险代码:
import ast import re def safe_evaluate_bool_expr(expr, true_vars): # 解析表达式抽象语法树 try: tree = ast.parse(expr, mode='eval') except SyntaxError: raise ValueError("表达式语法错误") # 验证表达式仅包含布尔运算和变量 allowed_node_types = (ast.Expression, ast.BoolOp, ast.And, ast.Or, ast.Name, ast.Constant) for node in ast.walk(tree): if not isinstance(node, allowed_node_types): raise ValueError("表达式包含不允许的操作") # 构建变量映射 all_vars = set(re.findall(r'\b[A-Za-z_][A-Za-z0-9_]*\b', expr)) var_map = {var: var in true_vars for var in all_vars} # 编译并执行 compiled = compile(tree, filename='', mode='eval') return eval(compiled, {}, var_map) # 测试示例 print(safe_evaluate_bool_expr(expr, {"A", "B", "C"})) # True print(safe_evaluate_bool_expr(expr, {"B", "C", "E"})) # False
这种方式会拦截函数调用、赋值等危险操作,安全性更高。
3. 自定义布尔表达式解析器(特殊需求场景)
如果需要支持自定义语法,或者完全控制求值逻辑,可以自己实现递归下降解析器。例如,手动解析表达式中的and/or运算、括号和变量,这种方式灵活性最高,但实现复杂度也更大,适合有特殊需求的场景。
内容的提问来源于stack exchange,提问作者user1474341
相关产品推荐
相关产品推荐

