如何在re.sub中评估替换部分?

1 投票
1 回答
1737 浏览
提问于 2025-04-17 19:11

我有一个字符串,比如说 'Alex 28'。现在,我想用正则表达式提取出数字 28,然后再加上 2。

在 Perl 里,我可以这样做:

#!/usr/bin/perl
use strict;
use warnings;

my $str='Alex 28';
$str=~s/(\d+)/$1+2/e;

为了在 Python 中实现这个,我尝试了下面的代码:

#!/usr/bin/python

import re

str = 'Alex 28'

match=re.sub(r'(\d+)',r'\g<1>',str)

我该如何对提取出来的 '\g<1>' 加上 2 呢?我试过用 int 函数,但没有成功。请帮帮我。

版本:Python 2.7.3

1 个回答

5

你可以通过给 re.subrepl 参数提供一个函数来使用它,具体可以参考这个链接

如果 repl 是一个函数,它会对每一个不重叠的模式匹配进行调用。这个函数会接收一个匹配对象作为参数,并返回一个替换的字符串。

举个例子:

def add_two(match):
    return str(int(match.group()) + 2)

s = 'Alex 28'
re.sub(r'(\d+)', add_two, s)

或者,你也可以使用一个 lambda 表达式:

re.sub(r'(\d+)', lambda m: str(int(m.group()) + 2), s)

请注意:

  • 使用 str 作为变量名是不好的选择,因为它会覆盖掉内置的 str
  • 替换操作只适用于字符串,所以作为 repl 参数传入的函数应该返回一个字符串。
  • 我使用了 match.group(),它会返回整个匹配的内容:如果正则表达式定义了多个组,你可能需要指定组的索引。

撰写回答