您想使用内置编解码器unicode_escape。
如果t 已经是bytes(8 位字符串),就这么简单:
>>> print(t.decode('unicode_escape'))
Róisín
如果t 已经被解码为Unicode,您可以通过这种方式将其编码回bytes 然后decode。如果您确定您的所有 Unicode 字符都已转义,那么您使用什么编解码器进行编码实际上并不重要。否则,您可以尝试取回原始字节字符串,但它更简单,可能更安全,只强制任何未编码的字符进行编码,然后将它们与已经编码的字符一起解码:
>>> print(t.encode('unicode_escape').decode('unicode_escape')
Róisín
如果您以后想知道如何使用正则表达式执行此类操作,请注意sub 允许您传递函数而不是repl 的模式。您可以通过调用int(hexstring, 16) 将任何十六进制字符串转换为整数,并使用chr 将任何整数转换为相应的Unicode 字符(请注意,这是Python 2 中不同的一位——您需要unichr)。所以:
>>> re.sub(r'(\\u[0-9A-Fa-f]+)', lambda matchobj: chr(int(matchobj.group(0)[2:], 16)), t)
Róisín
或者,让它更清楚一点:
>>> def unescapematch(matchobj):
... escapesequence = matchobj.group(0)
... digits = escapesequence[2:]
... ordinal = int(digits, 16)
... char = chr(ordinal)
... return char
>>> re.sub(r'(\\u[0-9A-Fa-f]+)', unescapematch, t)
Róisín
unicode_escape 编解码器实际上处理 \U、\x、\X、八进制 (\066) 和特殊字符 (\n) 序列以及 \u,它实现仅读取适当的最大位数的正确规则(\u 为 4,\U 为 8,等等,所以r'\\u22222' 解码为'∢2' 而不是'?'),可能还有更多我没有的东西没想到但这应该会给你这个想法。