我有一个字符串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
和群组捕获以某种方式解决它将会很棒。任何其他想法也表示赞赏。
答案 0 :(得分:2)
re.sub(r'([0-9])',A[int(r'\g<1>')],S)
不起作用的原因是\g<1>
反向引用仅在字符串替换模式中使用时才有效。如果你将它传递给另一种方法,它将&#34;见&#34;只有\g<1>
文字字符串,因为re
模块当时没有机会对其进行评估。 re
引擎仅在匹配期间对其进行评估,但在A[int(r'\g<1>')]
引擎尝试查找匹配项之前评估re
部分。
这就是为什么可以在re.sub
中使用回调方法作为替换参数:您可以将匹配的组值传递给任何外部方法以进行高级操作。
使用
import re
S = '02143'
A = ['a','b','c','d','e']
print(re.sub(r'[0-9]',lambda x: A[int(x.group())],S))
请参阅Python demo
请注意,您不需要使用括号捕获整个模式,您可以使用x.group()
访问整个匹配。