2011-02-04 1 views
0

ファイルから正規表現パターンのリストをロードしようとしていますが、各正規表現エントリを後で一致させるために使用できる配列に引っ張りたい着信テキストパターンを作成し、それに基づいてアクションをトリガーします。Python:ファイルからIRCボットにデータをロードする

私はすでにre.search()の動作を止めていましたが、regexパターンをファイルからロードしてからre.search()でファイルから取り出したさまざまな正規表現パターンをスキャンするにはどうすればよいですか?引数?

+0

すでに存在するIRCボットをいくつか見てみることもできます。たとえば[pmxbot](https://bitbucket.org/yougov/pmxbot/src)は、特定の文字列を見て適切に動作するようにします。 – chmullig

+0

私は特定のIRCボットフレームワークのためのモジュールを作ろうとしているので、これについて簡単に理解する必要があります。 –

答えて

2

あなたは正規表現がテキストパターンと一致したときにアクションをトリガしたい場合、あなたはおそらくアクションに正規表現のいくつかのマッピングを必要とするが(のは、それがマッピングと同じファイルで定義された関数への参照であると仮定しましょう)。あなたのmain.pyあなたがマッピングをインポートし、(彼らにすべての検索を再コンパイルを避けるために1回の操作)のすべての正規表現の表現をコンパイルして

mappings = [ 
    # (regex, action_name) 
    (r'Hi ([a-z]+)!', greet), 
    (r'Bye', bye), 
] 

def greet(msg): 
    return 'Hello' 

def bye(msg): 
    return 'Bye' 

、その後に対して検索を実行します。私たちはこのようなPythonのファイルrules.pyでルールを定義すると言います着信メッセージ。

import rules 

# compile regex 
compiled = dict([(re.compile(regex), action_name) for (regex, action_name) in rules.mappings]) 

def incoming(msg): 
    for regex, action_name in compiled: 
     if regex.search(msg): 
      # if search is successfull, execute action 
      action_function = getattr(rules, action_name) 
      action(msg) 

もちろん、そのアクションをどのようにトリガーするかによって異なりますが、主な原則が明確であることを願っています。

+0

テキストファイルからロードしようとしている場合、それに合わせてコードを変更するにはどうすればよいですか? –

+0

ありがとう、これは非常に役に立ちました。 :) –

1
# pre-compile regexes: 
with open('regex_file.txt') as f: 
    regexes = [re.compile(regex.strip()) for regex in f] 

# use them 
for regex in regexes: 
    m = regex.search(text) 
    if m: 
     print 'got match!!' 
関連する問題