在re.sub中处理包含数字的回溯引用

0 投票
1 回答
20 浏览
提问于 2025-04-14 16:16

下面是一个简单的正则表达式替换的例子:

import re
s = "Python version is: 3.10"
pat = r'(is:.*)\d+\.\d+$'
version = "3.12"
result = re.sub(pat, rf'\1{version}', s)
print(result)

这个例子会失败,错误信息是:

Traceback (most recent call last):
    ...
    raise s.error("invalid group reference %d" % index, pos)
re.error: invalid group reference 13 at position 1

发生的情况是,原始字符串会把反向引用理解为引用了版本字符串中的第一个“3”。

我尝试了不同的写法:

re.sub(pat, rf'\1{version}', s)
re.sub(pat, f'\\1{version}', s)
re.sub(pat, r'\1' + version, s)
re.sub(pat, r'\1{0}'.format(version), s)
re.sub(pat, r'\1' + f"{version}", s)

但是没有一个能把字符串部分当作真正的字符串来处理。我是不是只能使用命名捕获组来解决这个问题?

1 个回答

1

Python中的re.sub函数可以接受一个分组指示符,这个指示符可以用来处理编号分组和命名分组。

import re
s = "Python version is: 3.10"
pat = r'(is:.*)\d+\.\d+$'
version = "3.12"
result = re.sub(pat, rf'\g<1>{version}', s)
print(result)
import re
s = "Python version is: 3.10"
pat = r'(?P<keep>is:.*)\d+\.\d+$'
version = "3.12"
result = re.sub(pat, rf'\g<keep>{version}', s)
print(result)

撰写回答