【发布时间】:2023-03-23 11:12:01
【问题描述】:
让我们假设有这个前缀形式的产品总和布尔表达式:
str_formula = 'Or(A, And(B, C, D), E, F, And(G, H))'
Or 和And 是唯一允许的运算符,没有比上面表示的更多的嵌套结构。我想重写表达式以接收 infix 表单。
我的想法是:不使用正则表达式:
import ast
import re
or_op = ' OR '
and_op = ' AND '
str_formula = str_formula.replace('Or(', '[').replace('And(', '[').replace(')', ']')
s_list = re.sub('(\w+)', r"'\1'", str_formula)
list_formula = [x if isinstance(x, list) else [x] for x in ast.literal_eval(s_list)]
infix_form = or_op.join([and_op.join(sublist) for sublist in list_formula])
infix_form 变量是:
'A OR B AND C AND D OR E OR F OR G AND H'
您能否建议一个正则表达式以更智能地解决这个问题?
【问题讨论】:
-
您的中缀形式错误:缺少括号。
-
我觉得是对的。将我的中缀形式读为:A + BCD + E + F + GH。 AND 运算符具有高优先级 wrt OR
-
如果你想支持
OR和AND的任意嵌套,我认为Pythonsre不够先进,无法捕获这样的结构(它们不是常规语言),并且您最好使用更先进的解析解决方案。 (见:nested structures in Python) -
没有嵌套 Or 和 And。原始公式的形式是 A+B+...其中 A 和 B 的形式是 X * Y * Z(+ 是或,* 是和,和往常一样)
标签: python regex boolean-logic boolean-expression