Python re.sub:替换模式中的反向引用后跟数字

问题描述 投票:0回答:1

我想匹配字符串中的正则表达式,并在所有匹配项后添加字符

0
。 也就是说,每场比赛都会被替换为自身,后跟
0
。 但是因为
0
是一个数字,所以我不知道如何用作为
re.sub
的第二个参数给出的替换模式来编写它。

让我举一个更简单的问题的例子:在所有元音后面添加字符

X

import re
s = 'hello'
r = re.sub('([aeiou])', r'\1X', s)
print(r)

这将打印

heXlloX

但是假设我不想添加字符

X
,而是想添加字符
0
。 如果我尝试写这个

r = re.sub('([aeiou])', r'\10', s)

然后它认为我正在对编号为 10 的捕获组进行反向引用,并失败并显示

invalid group reference 10

我知道对于这个特定的模式,我可以将其重新设计为后向断言,以便替换模式不再需要反向引用。

r = re.sub('(?<=[aeiou])', '0', s)

这是可行的——但并不是所有的正则表达式都可以用这种方式用作lookbehind。

另一种方法是在匹配位置手动分解输入字符串,可能使用

re.finditer
,然后将其与
0
字符一起粘贴到我想要的位置。 但我希望避免这种情况。

在写这个问题时,我找到了答案,我将在下面发布。

python function python-re backreference
1个回答
0
投票

re.sub
可以将函数作为第二个参数。 该函数传递给
Match
对象。

import re
s = 'hello'
def f(matchobj):
    return matchobj.group(1) + 'X'
r = re.sub('([aeiou])', f, s)
print(r)

这将根据需要打印

he0llo0

总的来说,我认为任何带有反向引用的替换模式

\N
都可以重写为使用
matchobj.group(N)
的回调。

有趣的是,因为

matchobj.group(0)
给出了整个匹配,所以你可以不使用捕获组:

import re
s = 'hello'
def f(matchobj):
    return matchobj.group(0) + '0'
r = re.sub('[aeiou]', f, s)
print(r)

这也有效。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.