【问题标题】:Regex in boolean expression布尔表达式中的正则表达式
【发布时间】:2023-03-23 11:12:01
【问题描述】:

让我们假设有这个前缀形式的产品总和布尔表达式:

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

OrAnd 是唯一允许的运算符,没有比上面表示的更多的嵌套结构。我想重写表达式以接收 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
  • 如果你想支持ORAND 的任意嵌套,我认为Pythons re 不够先进,无法捕获这样的结构(它们不是常规语言),并且您最好使用更先进的解析解决方案。 (见:nested structures in Python
  • 没有嵌套 Or 和 And。原始公式的形式是 A+B+...其中 A 和 B 的形式是 X * Y * Z(+ 是或,* 是和,和往常一样)

标签: python regex boolean-logic boolean-expression


【解决方案1】:

考虑以下使用re.sub()函数和替换回调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

【讨论】:

  • 嗨罗曼,它不起作用。试试str_formula = 'Or(A,B,C)'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多