0

パイソンでは:

  1. 条件文では代入は許可されていません。
  2. 正規表現一致の状態は、他の一致情報も含む返された一致オブジェクトに基づいて決定されます。

ここで、10 または 15 の中から特定のパターンに一致させたいとします。最終的には、次のように雑然としたものになります。

m = pat1.match(buffer)
if m:    
    tok = tok1
    val = m.group(0)
else:
    m = pat2.match(buffer)
    if m:
        tok = tok2 
        val = m.group(0)
    else:
        m = pat3.match(buffer)
        if m:
            tok = tok3
            val = m.group(0)
            # extra processing here and there - makes looping unsuitable
        else:
            m = pat4.match(buffer)
            if m:
                tok = tok4
                val = m.group(0)
            else:    
                # ... keep indenting 

私たちは本当に次のようなものを持ちたいと思っています:

if match ... pat1:
    tok = 
    val = 
elif match ... pat2:
    tok = 
    val = 
elif match ... pat3:
    tok = 
    val = 
...

(他の言語でも同様の機能を使用できます: 条件付きでの代入、標準の一致オブジェクトへの副作用、参照引数渡しによる別の形式の一致関数など)

ループを使用してパターンを実行することもできますが、一致ごとに処理にバリエーションがある場合は適切ではありません。

だから:一致条件を同じレベルに保つための素晴らしいpythonic方法はありますか?!

4

1 に答える 1

4

トークンとパターンをペアでループして、以下を調整できるようにします。

for pat, token in zip([pat1, pat2, pat3], ['tok1', 'tok2', 'tok3']):
    m = pat.match(buffer)
    if m:
        val = m.group(0)
        tok = token1
        break

アイデアは、パターンの前にテーブルを作成することです->値:

tests = [
    (re.compile('([a-z]{2})'), 'func1'),
    (re.compile('(a{5}'), 'token2')
]

for pattern, token in tests:
    m = pattern.match(buffer)
    if m: 
        # whatever

これをさらに拡張して、コンパイルされたオブジェクトとバッファを引数として取り、それから必要なことを何でも実行して値を返すことができる callable を代わりに提供することができます。

例えば:

def func1(match, buf):
    print 'entered function'
    return int(buf) * 50

tests = [ 
    (re.compile('\d+'), func1)
]

for pattern, func in tests:
    m = pattern.match(buffer)
    if m:
        result = func(m, buffer)
于 2013-08-19T23:06:56.640 に答える