3

キーを正規表現として、アクション (パラメータ付き) を値として辞書を実装することは可能ですか?

例えば

  1. key = "actionname 1 2", value = "method(1, 2)"
  2. key = "differentaction par1 par2", value = "appropriate_method(par1, par2)"

ユーザーがキーを入力します。ユーザー入力の一部として提供されたパラメーターを使用して、一致するメソッドを実行する必要があります。

O(1)少なくとも私はこの問題を解決するための解決策を探しています.

数百の正規表現 (たとえば300) と、一致するパラメーター化されたアクションを実行します。

これを達成するためにループを書くことはできますが、for ループを使わずにこれを行うエレガントな方法はありますか?

関連する質問:正規表現によるハッシュテーブル/辞書/マップ ルックアップ

4

4 に答える 4

7

はい、それは完全に可能です:

import re
dict = {}
dict[re.compile('actionname (\d+) (\d+)')] = method
dict[re.compile('differentaction (\w+) (\w+)')] = appropriate_method

def execute_method_for(str):
    #Match each regex on the string
    matches = (
        (regex.match(str), f) for regex, f in dict.iteritems()
    )

    #Filter out empty matches, and extract groups
    matches = (
        (match.groups(), f) for match, f in matches if match is not None
    )


    #Apply all the functions
    for args, f in matches:
        f(*args)
于 2012-06-07T11:49:24.147 に答える
4

もちろん、辞書の値は Python 関数にすることができます。

マッチング関数は、文字列を各キーに一致させようとし、一致する場合は適切な関数を実行できます。最良の場合、これは時間的に線形になりますが、正規表現を使用したい場合、これ以上のものは得られないと思います。

しかし、あなたのサンプルデータを見ると、正規表現が必要かどうかを再考する必要があると思います. おそらく、入力文字列を解析して<procedure-name> <parameter>+、その名前 (単純な文字列) で適切なプロシージャを検索することができます。O(1)

于 2012-06-07T11:42:52.817 に答える
2

残念ながら、これは不可能です。正規表現が一致するかどうかを確認するには、正規表現を反復処理する必要があります。ただし、辞書での検索は行われO(1)ます(ただし、問題は解決しません)。

于 2012-06-07T11:44:35.277 に答える