Skip to main content
 首页 » 编程设计

python之bool 表达式中的正则表达式

2025年02月15日43xing901022

让我们假设这个乘积 bool 表达式的总和为前缀形式:

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

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

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

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'

你能建议一个正则表达式以更聪明的方式解决这个问题吗?

请您参考如下方法:

考虑以下使用 re.sub() 函数和 replacement 回调 replaceOperands 的方法:

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