在re.sub中处理包含数字的回溯引用
下面是一个简单的正则表达式替换的例子:
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)