Python 再置换转化

Python 再置换转化,python,regex,Python,Regex,我有一个字符串,其中所有unicode字符都被其整数值替换,并用括号括起来。例如,é已替换为[233]。我想将这些整数转换回unicode字符(显然,去掉括号)。我认为最简单的方法是使用一个简单的正则表达式替换(使用re库),但是我得到了一个错误 下面是一个不起作用的简单示例: s = 'Som[233] string' re.sub(r'\[(\d+)\]', chr(int(r'\1')), s) 这将返回错误: ValueError:基数为10的int()的文本无效:'\\1' 注意,我

我有一个字符串,其中所有unicode字符都被其整数值替换,并用括号括起来。例如,é已替换为[233]。我想将这些整数转换回unicode字符(显然,去掉括号)。我认为最简单的方法是使用一个简单的正则表达式替换(使用
re
库),但是我得到了一个错误

下面是一个不起作用的简单示例:

s = 'Som[233] string'
re.sub(r'\[(\d+)\]', chr(int(r'\1')), s)
这将返回错误:

ValueError:基数为10的int()的文本无效:'\\1'

注意,我使用相关问题的解决方案得到了相同的结果

错误表明字符串
\\1
正在传递给
int()
,而不是实际的捕获组

根据报告:

如果repl是一个函数,则会为每个非重叠函数调用它 模式的出现。该函数接受单个匹配对象 参数,并返回替换字符串

然后我尝试了这个,遵循文档中的示例:

def replace(match):
    return chr(int(match.group(0)))
re.sub(r'\[(\d+)\]', replace, s)
但这会返回一个类似的错误:

ValueError:以10为基数的int()的文本无效:“[233]”

我错过了什么?为什么要将列表传递给函数而不是捕获组?

上述函数按预期工作。第二个警告中的括号不是因为返回列表,而是因为捕获组0包含整个组,而不仅仅是数字:

re.search(r'\[(\d+)\]', s).group(0)
# '[233]'
re.search(r'\[(\d+)\]', s).group(1)
# '233'
因此,解决方案只是更改函数中使用的组:

def replace(match):
    return chr(int(match.group(1)))