python - 从 python 3 中的字符串中删除 unicode 表示的最简单方法?

标签 python string python-3.x escaping

我在 python 3 中有一个字符串,其中有几个 unicode 表示,例如:

t = 'R\\u00f3is\\u00edn'

我想转换 t 以便在打印时它具有正确的表示形式,即:

>>> print(t)
Róisín

但是我只是取回了原始字符串。我试过 re.sub 和其他一些,但我似乎无法找到一种方法来更改这些字符而不必遍历每个字符。 最简单的方法是什么?

最佳答案

您想使用内置编解码器 unicode_escape

如果t已经是一个bytes(8位字符串),就这么简单:

>>> print(t.decode('unicode_escape'))
Róisín

如果t已经被解码成Unicode,你可以将它编码回bytes,然后用这种方式解码。如果您确定所有 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' 而不是 '𢈢'),可能还有更多我没有想到的东西。但这应该会给你灵感。

关于python - 从 python 3 中的字符串中删除 unicode 表示的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13793973/

相关文章:

python - 使用 python 和 Kerberos 连接到 Hive

Java 将键码转换为字符串或字符

python - xlwings打开错误: not opening excel workbook getting an error upon call wb.

c++ - PSTR如何接收多个不以逗号分隔的字符串?

python - 如何检查作者是否在 x 服务器中具有 x 角色?

python - 如何在 CentOS 上将 Python3.5.2 设置为默认 Python 版本?

python - 直接在 Windows 上运行 python 文件时丢弃的命令行参数

python - 如何在pygame中显示图像?

python - 如何在 Azure Python SDK 中为 NetworkManagementClient 设置 session 代理?

arrays - 最佳时间的字符串转换