1

假设我有一个使用一组已知标记的布尔公式,例如:

  • 布尔运算符:and, or,not
  • 分组运算符:(,)

给定一个使用这些标记的布尔公式,例如:

F:(A or B) and not(A and C)

如何将此定义转换为集合运算符的 Python 表达式?

Fp =(x in A or x in B) and not(x in A and x in C)

有关此问题的背景,请参阅此线程和接受的答案

4

4 回答 4

1

假设您的变量长度为一个字符:

s = "(A or B) and not(A and C)"
print re.sub("(?<![a-zA-Z])([A-Za-z])(?![A-Za-z])", "x in \\1", s)
于 2014-03-11T17:37:55.440 回答
1

看起来基本上你将在x in任何不是你的令牌之一的东西之前添加。看起来像这样,也许:

tokens = ['and', 'or', 'not']
grouping = ['(', ')']

def resub(match):
    matchval = match.group(0)
    if matchval in tokens:
        return matchval
    return 'x in %s'%matchval

s = "(A or B) and not(A and C)"

re.sub('\w+', resub, s)
'(x in A or x in B) and not(x in A and x in C)'

它应该适用于被识别为单词的符号;如果您需要更具体的内容(即您的变量中有其他字符),您需要自己定义它而不是使用\w...

于 2014-03-11T17:43:25.203 回答
1

这个函数将匹配任何 Python 标识符,将替换任何所需的目标变量,并且它都被包装起来易于使用:

import re

def subst_in(s, varname, keywords={'and', 'or', 'not'}):
    repl = "{} in {{}}".format(varname)
    def fn(match):
        s = match.group(0)
        return s if s in keywords else repl.format(s)
    return re.sub("[a-z_][a-z0-9_]*", fn, s, flags=re.I)

f = "(A or B) and not(A and C)"
fp = subst_in(f, "x")

'(x in A or x in B) and not(x in A and x in C)'

编辑:虽然坦率地说它应该是

'x in B or (x in A and x not in C)'
于 2014-03-11T17:53:03.540 回答
1

有关设置操作,请参阅文档。您可以执行以下操作:

Fp = (A | B) - C
于 2014-03-11T17:33:41.880 回答