不能在 re.sub() repr 表达式中的函数调用中使用 ' ' 对捕获组的反向引用

问题描述 投票:0回答:1

我有一个字符串

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
和捕获组,否则呢?

python regex substitution backreference capture-group
1个回答
5
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.