Python 布尔表达式中的正则表达式

Python 布尔表达式中的正则表达式,python,regex,boolean-logic,boolean-expression,Python,Regex,Boolean Logic,Boolean Expression,让我们假设以前缀形式对乘积和进行布尔表达式: stru公式='或(A和(B,C,D),E,F和(G,H))' 或和和是唯一允许的运算符,没有比上面表示的嵌套结构更多的嵌套结构。我想重写表达式以接收中缀形式 在不使用正则表达式的情况下,我的想法是: import ast import re or_op = ' OR ' and_op = ' AND ' str_formula = str_formula.replace('Or(', '[').replace('And(', '[').repl

让我们假设以前缀形式对乘积和进行布尔表达式:

stru公式='或(A和(B,C,D),E,F和(G,H))'

是唯一允许的运算符,没有比上面表示的嵌套结构更多的嵌套结构。我想重写表达式以接收中缀形式

在不使用正则表达式的情况下,我的想法是:

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])
中缀形式变量为:
'A或B和C、D或E或F或G和H'


为了以更智能的方式解决这个问题,您能推荐一个正则表达式吗?

请考虑使用带有替换回调的
re.sub()
函数的以下方法
replaceOperators

str_formula = 'Or(A, And(B, C, D), E, F, And(G, H))'

def replaceOperands(m):
    s = re.sub(r'\(|\)', '', m.group(2).replace(',', ' OR')) if m.group(1) == 'Or' else '('+m.group(2).replace(',', ' AND')+')'
    return s

str_formula = re.sub(r'\b(Or)\(([A-Z], (?:\(.*\))[A-Z]?)', 
                     replaceOperands, 
                     re.sub(r'\b(And)\(([^)]+)\)', replaceOperands, str_formula))
print(str_formula)
输出:

A OR B AND C AND D OR E OR F OR G AND H

你的中缀形式错了:括号不见了。我想这是对的。把我的中缀表格读作:A+BCD+E+F+GH。AND运算符具有高优先级wrt ORI,如果您想支持
的任意嵌套,我认为python
re
不够先进,无法捕获此类构造(它们不是常规语言),最好使用更先进的解析解决方案。(请参阅:)无嵌套或。原始公式的形式是A+B+…其中A和B的形式是X*Y*Z(+是或,*是,和往常一样)Hi Roman,它不起作用。尝试使用
stru公式='或(A、B、C)