2017-01-29 4 views
0

私は、ユーザー入力(文字列)に応じて異なる情報を出力するボットを作っています。入力を解析し、異なる結果にリダイレクトするためのより良い方法がある場合、私は思ったんだけど:Pythonで文字列の入力を解析する方がいいですか?

def query(msg: str): 
    if re.compile(r"moci(o|ó)?n(es)? de (procedimiento)s?", re.IGNORECASE).search(msg): 
     return open("mociones/mocion_procedimiento.txt", "r").read() 

    elif re.compile(r"moci(o|ó)?n(es)? de (ó|o)?rden(es)?", re.IGNORECASE).search(msg): 
     return open("mociones/mocion_orden.txt", "r").read() 

    elif re.compile(r"moci(o|ó)?n(es)? de duda(s)?", re.IGNORECASE).search(msg): 
     return open("mociones/mocion_duda.txt", "r").read() 

    elif re.compile(r"moci(o|ó)?n(es)? de privilegio(s)?", re.IGNORECASE).search(msg): 
     return open("mociones/mocion_privilegio.txt", "r").read() 

    ... 

    elif re.compile(r"defender (el|los)? anteproyectos?", re.IGNORECASE).search(msg): 
     return open("debate_particular/index.txt", "r").read() 

    elif re.compile(r"anteproyectos?", re.IGNORECASE).search(msg): 
     return open("anteproyecto/index.txt", "r").read() 

    else: 
     return "_*ERROR*_\n\nNo search results were found for \n`{query}`".format(query=msg) 
+2

*「良い」*どうやって?これが改善されると思われる作業コードの場合は、[codereview.se]を見てください。また、関数を呼び出すたびに正規表現を明示的に再コンパイルすると、コンパイルしない場合よりも効率が悪くなる可能性があります。コンパイルの恩恵を受けるには、関数を関数の外側に移動します。 – jonrsharpe

答えて

2

明白な提案は辞書regex => pathを持っているし、代わりにif文の束のループを使用することです:

これまでに、必要に応じて reは裏でコンパイルするの世話をするため
paths = { 
    r"(?i)moci[oó]?n(es)? de (procedimiento)s?": "mociones/mocion_procedimiento.txt", 
    r"(?i)moci[oó]?n(es)? de [óo]?rden(es)?": "mociones/mocion_orden.txt" 
} 

def path_for_msg(msg): 
    for r, p in paths.items(): 
     if re.search(r, msg): 
      return p 

またre.compileは、ほとんどありません。

順序が重要な場合には、適切なデータ構造は、タプルのリストです:

paths = [ 
    (r"(?i)moci[oó]?n(es)? de (procedimiento)s?", "mociones/mocion_procedimiento.txt"), 
    (r"(?i)moci[oó]?n(es)? de [óo]?rden(es)?", "mociones/mocion_orden.txt") 
} 

def path_for_msg(msg): 
    for r, p in paths: 
     if re.search(r, msg): 
      return p 
+0

しかし、私が注文をする方法はありますか?これはまったく無視しているようです...注文は重要です – margobra8

+0

@ margobra8:投稿を更新しました – georg

0

代替は、より多くのオブジェクト指向のアプローチを採用することで、異なるタイプの入力を処理するために別々のクラスを作成し、それらを責任の連鎖の中に配置してください - georgの提案に似ていますが、未加工正規表現パターンの代わりにメッセージハンドラオブジェクトを繰り返している点を除きます。

詳細はthis answerを参照してください。

関連する問題