一个功能强大的Python布尔表达式解析器,支持变量、算术运算、逻辑运算、字符串操作和数组访问。
这个项目实现了一个灵活的布尔表达式解析和求值引擎,可以解析复杂的表达式字符串并在给定的上下文中计算结果。它使用PyParsing库构建语法解析器,支持多种数据类型和操作符。
- 数字: 整数和浮点数 (
5,3.14,-10) - 布尔值:
True,False - 字符串: 单引号或双引号字符串 (
'hello',"world") - 数组: 支持常量数组 (
[1, 2, 3],['a', 'b'])
==等于!=不等于<小于>大于<=小于等于>=大于等于in包含关系
+加法-减法*乘法/除法
and/AND逻辑与or/OR逻辑或not/NOT逻辑非
- 简单变量:
name,age - 数组索引:
scores[0],matrix[1][2] - 对象属性:
user.name,item[0].price
|upper转换为大写|lower转换为小写|split('delimiter')字符串分割|strip('chars')去除指定字符
- 支持使用括号控制运算优先级
- 运算符优先级遵循数学规则
from bool_parser import BooleanExpression
# 创建表达式对象
exp = BooleanExpression("5 > 3")
# 计算表达式结果
result = exp.evaluate()
print(result) # True# 带变量的表达式
exp = BooleanExpression("age >= 18 and score > 80")
# 提供变量上下文
context = {'age': 25, 'score': 95}
result = exp.evaluate(context)
print(result) # True# 算术运算
exp = BooleanExpression("(salary + bonus) * 0.8 > 50000")
result = exp.evaluate({'salary': 45000, 'bonus': 15000})
# 数组操作
exp = BooleanExpression("scores[0] > 90 and 'math' in subjects")
context = {
'scores': [95, 87, 92],
'subjects': ['math', 'science', 'english']
}
result = exp.evaluate(context)
# 字符串操作
exp = BooleanExpression("name|upper == 'JOHN'")
result = exp.evaluate({'name': 'john'})- Python 2.7+ 或 Python 3.x
- PyParsing 库
pip install pyparsingbool_expression_parser/
├── bool_parser.py # 核心解析器实现
├── test_simple_bool.py # 单元测试
└── README.md # 项目文档
主要的用户接口类,用于创建和计算表达式。
方法:
__init__(exp): 初始化表达式evaluate(context=None): 计算表达式值
语法定义类,使用PyParsing定义表达式的语法规则。
表达式元素的基类,包括:
Constant: 常量值Variable: 变量引用Array: 数组字面量Operator: 二元操作符NotOperator: 逻辑非操作符SplitModificator: 字符串分割修饰符StripModificator: 字符串去空格修饰符UpperModificator: 大写转换修饰符LowerModificator: 小写转换修饰符
- 变量名由字母、数字和下划线组成,首字符必须是字母或下划线
- 字符串用单引号或双引号包围
- 数组用方括号表示,元素用逗号分隔
- 使用空格分隔操作符和操作数
- 括号
() - 数组访问
[]、属性访问. - 字符串修饰符
| - 逻辑非
not - 乘除
*/ - 加减
+- - 比较操作符
==!=<><=>=in - 逻辑与
and - 逻辑或
or
这个布尔表达式解析器适用于以下场景:
- 规则引擎: 配置驱动的业务规则判断
- 数据过滤: 根据表达式过滤数据集
- 条件配置: 在配置文件中定义复杂的条件逻辑
- 模板系统: 在模板中进行条件渲染
- 工作流: 定义工作流的条件分支
- 项目最初为Python 2设计,在Python 3中运行可能需要一些兼容性调整
- 字符串修饰符功能在Python 3中可能需要修复
basestring相关的问题 - 表达式解析是递归的,过于复杂的嵌套可能影响性能
欢迎提交问题报告和功能请求。如果你想贡献代码,请确保:
- 编写相应的单元测试
- 遵循现有的代码风格
- 确保Python 2/3兼容性
huxx hzd0107@hotmail.com