Python 再置换转化
我有一个字符串,其中所有unicode字符都被其整数值替换,并用括号括起来。例如,é已替换为[233]。我想将这些整数转换回unicode字符(显然,去掉括号)。我认为最简单的方法是使用一个简单的正则表达式替换(使用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' 注意,我
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)))