You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否针对输入集对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:02:50