2016-05-13 25 views
4

さて、通常、私はこれらの質問をしません。Python:正規表現の置き換え

re.subを使用して通常の文字列を検索して置き換えるのは簡単ですが、(一致する部分ではなく)置換部分の正規表現がどのように機能しますか?

特に、を参照すると、正確にこれを説明し、彼がPearlで使用していたのと同じ種類の機能を複製するコードを提供しますが、Pythonで開発するのに苦労しました。

import fileinput 
import re 

for line in fileinput.input(): 
    line = re.sub(r'\* \[(.*)\]\(#(.*)\)', r'<h2 id="\2">\1</h2>', line.rstrip()) 
    print(line) 

このサブは

* [the label](#the_anchor) 

と一致して

<h2 id="the_anchor">the label</h2> 

それは作品に置き換えることを意味している。しかし、どのようにスクリプトがラベルとアンカーが何であるかを正確に知っているのですか?おそらく\ 1と\ 2は目的のテキストと一致することを意図していますが、スクリプトはこれをどのように知っていますか、先頭の*が\ 1を参照しているとは思わないでしょうか?

+0

括弧のためです。置換の '\ 1'は、正規表現の最初のペア(すなわち、最初の'(*))と一致したものを参照します。 – drdaeman

+0

'\ 1'、' \ 2'は置き換えられるパターンの最初と2番目の一致したグループです。グループはカッコ内のパターンの部分です。 – schwobaseggl

+0

'\(GroupReference)'は、一致するテキストにあったグループを参照するためのものです。グループが何であるかわからない場合は、それらを調べることをお勧めします。この場合、 '\ 1'と' \ 2'はグループ1と2への参照、つまり第一と第二の対の '()'括弧内のものです。 –

答えて

3

置換文字列内の\1\2は、1番目と2番目の「キャプチャ」を参照しています。キャプチャはカッコで囲まれたパターン正規表現の部分です。

r'\* \[(.*)\]\(#(.*)\)' 
     ^^^^  ^^^^ 

だから\1は、第一の捕捉にマッチした何を意味し、\2は、第二の捕捉にマッチしたものは何でもを指す:

例えば、ここでの例正規表現でキャプチャです。

+0

正規表現がゼロから数えられるとは思わないのはなぜですか? smh – Stumbler

+1

実際、多くの正規表現の実装では、 '\ 0'はマッチした文字列全体を参照します。これはおそらくPythonの正規表現に当てはまります。 – ErikR

+0

Pythonでは、置換の全一致にアクセスするには 'r '\ g <0>''が必要です。ただドキュメントを読んでください。 –

関連する問題