我想匹配字符串中的正则表达式,并在所有匹配项后添加字符
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
字符一起粘贴到我想要的位置。 但我希望避免这种情况。
在写这个问题时,我找到了答案,我将在下面发布。
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)
这也有效。