我正在开发一个可以接受关系和逻辑运算符的规则系统。
规则系统中的一个简单表达式可以像
一样简单 EmployeeAgeProperty >= IntegerProperty:27
我在这里定义了用什么来代替 EmployeeHireDateProperty我的规则系统会对此进行评估。假设像上面这样的每个简单表达式的计算结果都是真/假。我的正则表达式是
(?P<lhs>[A-Z][a-zA-Z]*Property):{0,1}(?P<lhsPrimitiveValue>[A-Za-z0-9]*)\ *(?P<operator>[><=]|!=|<=|>=|in|not_in)\ *(?P<rhs>[A-Z][a-zA-Z]*Property):{0,1}(?P<rhsPrimitiveValue>[A-Za-z0-9]*)
lhs = 左侧
rhs = 右侧。
现在,我想通过逻辑运算符 And/Or(假设 Not 脱离上下文)将多个简单表达式组合成复合表达式。
所以,一个有效的复合表达式应该是
SimpleExpression1 and SimpleExpression2 or SimpleExpression3 其中每个简单表达式依次匹配上述正则表达式。
我希望我的正则表达式组返回 ('SimpleExpression1', 'and', SimpleExpression2', 'or', 'SimpleExpression3')
我可以想出这样的东西
([\w\d!=< ]*)\ *(and|or)\ *([\w\d!=< ]*)这会将单个复合表达式与一个和/或匹配。但无法进一步扩展。
请您参考如下方法:
也许你想尝试re.split,另见this question.
re.split('(and|or)', 'this and this or that')
Out[18]: ['this ', 'and', ' this ', 'or', ' that']
