2016-05-13 135 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>''。只需阅读文档。 –