2012-11-07 39 views
7

文字列で正規表現変数を埋めたいと思います。正規表現文字列をパラメータで埋める方法

import re 

hReg = re.compile("/robert/(?P<action>([a-zA-Z0-9]*))/$") 
hMatch = hReg.match("/robert/delete/") 
args = hMatch.groupdict() 

args変数は、{"action": "delete"}を持つdictになりました。

どのようにこのプロセスを逆にすることができますか? args dictとregexパターンでは、どのように文字列 "/ robert/delete /"を得ることができますか?

このような機能を持つことは可能ですか?

def reverse(pattern, dictArgs): 

+0

を追加しました...なぜあなたは必要があります:あなたは

regex_compiled.pattern 

EDIT2でパタパタからそれを得ることができますその文字列を再構築する正規表現?あなたはすでに違いを生むすべてのビットを持っています。それらのビットを取り、文字列を作成する関数を書くだけです。 (つまり、これは不可能ではありませんし、おそらくあなたの時間を無駄にすることはありません) – Tomalak

+0

この "機能"はDjangoでURL文字列を取得するためにreverse()のような関数を実装したいと思います。 Djangoはargsを使って "brute-force"パターンを作成することは可能でしょうか? – 0xBAADF00D

+1

これはPythonのものですが、Djangoのものではありません。しかし、私のポイントはこれです。例えば、/ robe [または] t?/(?P ((?!foo)[a-zA-Z0-9] *)) ''?正規表現には、互いに依存するオプション部分と条件部分が含まれているため、マッチリストから元の文字列に戻る方法はありません。したがって、許可されている正規表現の極端に狭いサブセットを定義するか、そのためのパーサーを作成します。おそらくまだいくつかの副作用がなく、厳しく制限されているか、より生産的に時間を費やしています。 ;)正規表現マッチングは片道です。 – Tomalak

答えて

2

この機能がすべきことは、

def reverse(regex, dict): 
    replacer_regex = re.compile(''' 
     \(\?P\<   # Match the opening 
      (.+?)  # Match the group name into group 1 
     \>\(.*?\)\)  # Match the rest 
     ''' 
     , re.VERBOSE) 

    return replacer_regex.sub(lambda m : dict[m.group(1)], regex) 

あなたは基本的に(\?P ...)ブロックにマッチし、辞書からの値で置き換えます。

EDIT:regexは私のexmpleの正規表現の文字列です。あなたはあなたがそれに興味を持っていることを延ばすには、あなたの文字列を記述する値の辞書を持っている場合は、詳細正規表現は

+0

この機能は私のプロジェクトでうまくいきます、ありがとう! – 0xBAADF00D

0

は実際に、私は「一般的なケースでは、」それは、いくつかの狭いケースのためになんとかだと思ったが、かなり複雑なものをありがとう。

ある種の有限状態マシンを記述し、正規表現の文字列を解析し、異なる部分を分割してから、この部分に対して適切な処置をとる必要があります。

通常のシンボルの場合、シンボルを結果文字列に "そのまま"置きます。 名前付きグループの場合 - dictArgsの値を代わりに入れてください オプションのブロックについては、値の一部を入れてください。

などです。

1つのrequllar式は、大きな(または無限の)文字列と一致することがよくありますので、この「逆の」関数はあまり役に立ちません。

関連する問題