8

正規表現変数に文字列を入力したいと思います。

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 と正規表現パターンを使用して、文字列 "/robert/delete/" を取得するにはどうすればよいですか?

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

def reverse(pattern, dictArgs):

ありがとうございました

4

3 に答える 3

3

この関数はそれを行う必要があります

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...) ブロックを一致させ、dict の値に置き換えます。

編集: regex は私の例の正規表現文字列です。パタパタから入手できます

regex_compiled.pattern

EDIT2: 詳細な正規表現が追加されました

于 2012-11-07T10:44:31.793 に答える
0

実際、いくつかの狭いケースでは実行可能だと思いますが、「一般的なケース」ではかなり複雑です。

ある種の有限状態マシンを作成し、正規表現文字列を解析し、さまざまな部分を分割してから、この部分に対して適切なアクションを実行する必要があります。

通常の記号の場合 — 記号を「そのまま」結果文字列に入れるだけです。名前付きグループの場合 — それらの代わりに dictArgs の値を配置します オプションのブロックの場合 — その値の一部を配置します

等々。

1 つの requllar 式は多くの場合、大きな (または無限の) 文字列セットに一致する可能性があるため、この「逆」関数はあまり役に立ちません。

于 2012-11-07T10:35:05.130 に答える