在Python中使用re.sub获取组匹配

时间:2016-03-24 08:40:40

标签: python regex perl

在Perl中,我可以进行替换并同时捕获组匹配。 e.g。

my $string = "abcdef123";
$string =~ s/(\d+)//;
my $groupMatched = $1; # $groupMatched is 123

在Python中,我可以使用re.sub函数进行替换,如下所示。但是,我找不到一种方法来捕获\ d +组匹配而不调用另一个函数re.match并执行其他操作。

string = "abcdef123"
string = re.sub("(\d+)", "", string)

有谁知道如何捕获" \ d +"匹配值作为来自同一re.sub操作的单独变量?我尝试了以下命令但它没有工作。

print r'\1'

4 个答案:

答案 0 :(得分:7)

您可以欺骗并将功能传递给re.sub

results = []
def capture_and_kill(match):
    results.append(match)
    return ""
string = "abcdef123"
string = re.sub("(\d+)", capture_and_kill, string)
results[0].group(1)
# => '123'

答案 1 :(得分:1)

您可以执行以下操作:

sub_str = re.search("(\d+)", str).group(1)

会找到“123”部分。

然后你替换它:

str = str.replace(sub_str, "")

请注意,如果序列超过[0-9],则需要使用findall并在所有匹配项上手动迭代。

答案 2 :(得分:0)

在python 3.6下测试的代码下面。

test = "abcdef123"
resp = re.sub(r'\w+[A-Za-z](\d+)',r'\1',test)
print (resp)

123

答案 3 :(得分:0)

要建立Marouns答案,您还可以执行以下操作:

str = "foobarzoo"
match = re.search(r"foo(bar)", str)

然后将其替换为完全匹配的“ foobar”:

str = str.replace(match.group(0), "")

然后可以通过以下方式访问第一个组(在方括号内)“ bar”:

match.group(1)

使用此方法str最终将等于“ zoo”