【问题标题】:simplifying AND OR Boolean Expression简化 AND OR 布尔表达式
【发布时间】:2019-01-17 06:25:30
【问题描述】:

我的问题是转成这样的字符串。

 "a OR (b AND c)"
into
  a OR bc

如果表达式是这样的

"a AND (b OR c)"

 then gives

  ab OR ac

我无法使用 REGEX 匹配设计一组正确的循环。问题的症结在于代码必须是完全通用的,因为我无法假设字符串模式会有多长,也无法假设模式中 OR AND 的确切位置。

  • 安全性或((互联网或在线或无纸化)和(银行*))和(移动或手机或电话或访问)或在银行或交易中轻松或在线或孟买或德里 NEAR/10 琼脂或(在线或互联网) AND (bank) OR not OR (apple) EXCLUDE (mongo)

如果我这样输入,它也会解决这种类型的表达式。

【问题讨论】:

标签: python regex python-3.x parsing


【解决方案1】:

Imo,您需要在这里使用解析器,例如PLY。您需要定义所有积木,然后可以构建一个语法树,您可以使用它做任何您想做的事情。
一个例子可能是:

import ply.lex as lex

# List of token names.   This is always required
tokens = (
    'VARIABLE',
    'WHITESPACE',
    'OR',
    'AND',
    'NOT',
    'PAR_OPEN',
    'PAR_CLOSE',
)

# Regular expression rules for simple tokens
t_VARIABLE      = r'\b[a-z]+\b'
t_WHITESPACE    = r'\s+'
t_OR            = r'\bOR\b'
t_AND           = r'\bAND\b'
t_NOT           = r'\bNOT\b'
t_PAR_OPEN      = r'\('
t_PAR_CLOSE     = r'\)'

def t_error(t):
    print("Illegal character '%s'" % t.value[0])
    t.lexer.skip(1)

# Build the lexer
lexer = lex.lex()
lexer.input("a OR (b AND c)")

while True:
    token = lexer.token()
    if not token:
        break
    else:
        print(token)

这会产生

LexToken(VARIABLE,'a',1,0)
LexToken(WHITESPACE,' ',1,1)
LexToken(OR,'OR',1,2)
LexToken(WHITESPACE,' ',1,4)
LexToken(PAR_OPEN,'(',1,5)
LexToken(VARIABLE,'b',1,6)
LexToken(WHITESPACE,' ',1,7)
LexToken(AND,'AND',1,8)
LexToken(WHITESPACE,' ',1,11)
LexToken(VARIABLE,'c',1,12)
LexToken(PAR_CLOSE,')',1,13)

它甚至可以使用嵌套括号,然后您可以分析较小的部分(例如,从 PAR_OPENPAR_CLOSE 等)。

【讨论】:

  • 感谢回答我的问题,这就是我要找的。我今天学到了新东西(ply - lex 或 yacc)。这对我以后的工作很有帮助。
  • 我仍然无法获得输出,请您建议我任何教程学习并完成我的输出。
  • jan 你能否为示例问题创建解析器"a AND (b OR c)" then gives ab OR ac 谢谢你的帮助。
  • @bipulkumar:我已经发布了另一个问题,请参阅stackoverflow.com/questions/54270555/…
  • 感谢 gilch,我会尝试用它来解决我的问题。
【解决方案2】:

Pyparsing 可以很容易地为这种表示法定义表达式解析器。将您的 AND、OR 等关键字视为运算符,将您的术语(如“安全”等)视为中缀符号语法中的操作数,您可以使用 pyparsing 的 infixNotation 语法生成器来定义您的解析器:

sample = "security OR ((internet OR online OR paperless) AND (bank*)) AND (mobile OR cell OR phone OR access) OR easy OR online WITHIN bank OR transaction OR mumbai OR delhi NEAR/10 agar OR (online OR internet) AND (bank) OR not OR (apple) EXCLUDE (mongo)"

import pyparsing as pp
# enable packrat parsing, since this infix notation gets more complex than usual
pp.ParserElement.enablePackrat()

term = pp.Word(pp.alphas + '*')
SLASH = pp.Suppress('/')

AND = pp.Keyword("AND")
OR = pp.Keyword("OR")
WITHIN = pp.Keyword("WITHIN")
EXCLUDE = pp.Keyword("EXCLUDE")
NEAR_op = pp.Group(pp.Keyword("NEAR") + SLASH + pp.pyparsing_common.integer)
expr = pp.infixNotation(term,
                        [
                            (NEAR_op, 2, pp.opAssoc.LEFT),
                            (WITHIN, 2, pp.opAssoc.LEFT),
                            (AND, 2, pp.opAssoc.LEFT),
                            (OR, 2, pp.opAssoc.RIGHT),
                            (EXCLUDE, 2, pp.opAssoc.LEFT),
                        ])

expr.parseString(sample).pprint()

打印:

[[['security',
   'OR',
   [[[['internet', 'OR', ['online', 'OR', 'paperless']], 'AND', 'bank*'],
     'AND',
     ['mobile', 'OR', ['cell', 'OR', ['phone', 'OR', 'access']]]],
    'OR',
    ['easy',
     'OR',
     [['online', 'WITHIN', 'bank'],
      'OR',
      ['transaction',
       'OR',
       ['mumbai',
        'OR',
        [['delhi', ['NEAR', 10], 'agar'],
         'OR',
         [[['online', 'OR', 'internet'], 'AND', 'bank'],
          'OR',
          ['not', 'OR', 'apple']]]]]]]]],
  'EXCLUDE',
  'mongo']]

(免责声明:我是pyparsing的作者。)

GitHub 页面:https://github.com/pyparsing/pyparsing

文档:https://pyparsing-docs.readthedocs.io/en/latest/

安装:pip install pyparsing

【讨论】:

  • 你能给我提供链接吗,用于 pyparsing infixNotation 语法生成器。
  • 添加到答案正文的链接。项目示例目录中有几个示例包含使用 infixNotation,如果您在导入 pyparsing 后在 Python 提示符处键入 help(pyparsing.infixNotation),则包含一个简单示例。
  • 我只是一个实习生,说明我对 python 的了解并不多,先生,你能不能为"a AND (b OR c)" then gives ab OR ac 做一些示例代码,我会弄清楚其余的例子,谢谢 Paul帮助我。
猜你喜欢
  • 2016-07-13
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多