用转换重新替换

时间:2019-04-18 16:00:07

标签: python regex

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

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

s = 'Som[233] string'
re.sub(r'\[(\d+)\]', chr(int(r'\1')), s)

这将返回错误:

  

ValueError:以10为底的int()无效文字:'\\ 1'

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

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

根据documentation

  

如果repl是一个函数,则每次不重叠时都会调用它   模式的发生。该函数采用单个匹配对象   参数,并返回替换字符串。

因此,我按照文档中的示例尝试了此操作:

def replace(match):
    return chr(int(match.group(0)))
re.sub(r'\[(\d+)\]', replace, s)

但这会返回类似的错误:

  

ValueError:以10为底的int()无效文字:'[233]'

我在这里想念什么?为什么将列表传递给函数而不是捕获组?

1 个答案:

答案 0 :(得分:0)

上面的功能可以正常工作。第二个警告中的括号不是因为正在返回列表,而是因为捕获组0包括 entire 组,而不仅仅是数字:

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)))