2016-06-23 18 views
2

thisまたはthatを検索する正規表現があります。 thisが見つかった場合は、ONEに置き換えられます。 に置き換えられた場合はthatとなります。ここでif文のPython正規表現置換

はそれがPerlで次のようになります。

m =~ s/(this)|(that)/ "ONE" x!! $1 . "TWO" x!! $2 /eg 

eevalをオプションです。 .は連結です。 x!!はif文として機能します。

私はPython 3でも同じことをすることができますか?私は、私は2つの主要な障害を持っていると思います

m = re.sub(r"(this)|(that)", ("ONE" * bool(match.group(1))) + ("TWO" * bool(match.group(2))), m, flags=re.EVAL) 

:私のようなものを探しています。まず、matchオブジェクトを入手する方法がわかりません。内に正規表現の置き換えがあります。第二に、私はevalがPythonによってサポートされているかどうか、あるいは最良の代替案が何であるかはわかりません。

+1

あなたは[ドキュメント](HTTPSを確認しました。 org/3/library/re.html#re.sub)? – user2357112

答えて

4

Pythonには、正規表現に関連する奇妙な言語構文がありません。それらは、正常に動作する関数呼び出しで実行されます。

したがって、matchで実行される呼び出し引数の代わりに、コールバック関数があります。代入文字列ではなく、第2引数として呼び出し可能オブジェクトを配置するだけです。呼び出し可能オブジェクトは、唯一の引数としてマッチオブジェクトを受け取ります。この場合

、あなたが必要とするすべてがインラインifである - ので、あなたもラムダ式として呼び出し可能に定義することができます。//docs.python:

t = "this this that" 
m = re.sub(r"(this)|(that)", lambda x: "ONE" if x.group() == "this" else "TWO", t ) 
+1

* "Pythonには正規表現に関連する奇妙な言語構文はありません" *。いいえ、しかし、他のものに関連する「奇妙な言語構文」を持っていますが、あなたの種族主義は歓迎されません。 – Borodin

+0

私はあなたの答えを明確にしようとしましたが、これを頭にも尻尾にもできません。あなたがしなければならないことは、置換文字列の代わりに第2引数として呼び出し可能なオブジェクトを置くことだけです。呼び出し可能オブジェクトは、唯一の引数 " *。それを分解して – Borodin

+0

*を説明してください。 "コールダブルをラムダ式として定義することさえできるようになりました" * No * "strange language syntax" *ここに! Perlでは、* lambdaは名前を持たないサブルーチンであり、 'def'がよりフレキシブルであればPythonも同じである可能性があります – Borodin