2016-05-13 132 views
4

好的,通常我不會問這些問題。Python:正則表達式替換

使用re.sub查找和替換普通字符串很簡單,但替換部分(而不是匹配部分)中的正則表達式如何工作?

特別是,參照Brian Okken's web-page這個說法正是爲了解釋這一點,提供代碼來複制他曾在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'是指與正則表達式中第一對parens(即第一個「(*)」)匹配的任何內容。 – drdaeman

+0

'\ 1','\ 2'是要替換的模式的第一個和第二個匹配組。組是圓括號中模式的一部分。 – schwobaseggl

+0

'\(GroupReference)'是爲了引用匹配文本中的組。如果你不知道什麼羣體,我建議你看看這些羣體。在這種情況下,'\ 1'和'\ 2'分別是對組1和2的引用,換句話說就是第一對和第二對'()'括號內的內容。 –

回答

3

替換字符串中的\1\2指的是第一個和第二個「捕獲」。捕獲是模式正則表達式的一部分,它們被括在括號中。

例如,下面例子中有正則表達式的捕獲:

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

所以\1是指無論是第一擷取匹配,\2是指無論是通過第二種捕獲匹配。

+0

爲什麼我不認爲正則表達式會從零算起? smh – Stumbler

+1

實際上,在很多正則表達式實現中'\ 0'指的是整個匹配的字符串。這可能是真正的Python正則表達式。 – ErikR

+0

在Python中,要訪問替換中的整個匹配項,需要'r'\ g <0>''。只需閱讀文檔。 –