捕获'重新'组并替换为列表的相应元素

时间:2018-02-09 00:53:27

标签: python regex

我有一个字符串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和群组捕获以某种方式解决它将会很棒。任何其他想法也表示赞赏。

1 个答案:

答案 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()访问整个匹配。