我有一个字符串
S = '02143'
和一个列表A = ['a','b','c','d','e']
。我想用列表中相应的元素替换“S”中的所有数字A
.
例如,将
0
替换为A[0]
,将2
替换为A[2]
等。最终输出应该是S = 'acbed'
。
我试过:
S = re.sub(r'([0-9])', A[int(r'\g<1>')], S)
但是这给出了一个错误
ValueError: invalid literal for int() with base 10: '\\g<1>'
。我猜它正在考虑将反向引用'\g<1>'
作为一个字符串。我怎样才能解决这个问题,特别是使用 re.sub
和捕获组,否则呢?
re.sub(r'([0-9])',A[int(r'\g<1>')],S)
不起作用的原因是 \g<1>
(这是第一个反向引用的明确表示,否则写为 \1
)反向引用仅在 string 替换模式中使用时才有效。如果将它传递给另一个方法,它只会“看到”\g<1>
文字字符串,因为 re
模块此时没有任何机会对其进行评估。 re
引擎仅在匹配期间对其进行评估,但 A[int(r'\g<1>')]
部分在 re
引擎尝试查找匹配之前进行评估。
re.sub
中使用回调方法作为替换参数的原因:您可以将匹配的组值传递给任何外部方法以进行高级操作。
re
文档:
re.sub(pattern, repl, string, count=0, flags=0)
如果
是一个函数,它会被每个非重叠调用repl
的发生。该函数采用单个匹配对象 参数,并返回替换字符串。pattern
使用
import re
S = '02143'
A = ['a','b','c','d','e']
print(re.sub(r'[0-9]',lambda x: A[int(x.group())],S))
查看 Python 演示
注意你不需要capture带括号的整个模式,你可以使用
x.group()
访问整个匹配。