1

たとえば、既知のトークンのセットを使用するブール式があるとします。

  • ブール演算子: andornot
  • グループ化演算子: (,)

これらのトークンを使用するブール式を考えると、次のようになります。

ふ:(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

この関数は、任意の 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

変数の長さが 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

集合演算についてはドキュメントを参照してください。次のようなことができます:

Fp = (A | B) - C
于 2014-03-11T17:33:41.880 に答える
1

x in基本的に、トークンの 1 つではないものの先頭に追加するように見えます。それは次のようになります。

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 に答える