rpt*_*nan 7 python string escaping python-3.x
我在python 3中有一个字符串,其中包含几个unicode表示,例如:
t = 'R\\u00f3is\\u00edn'
Run Code Online (Sandbox Code Playgroud)
并且我想转换t以便在我打印它时具有正确的表示,即:
>>> print(t)
Róisín
Run Code Online (Sandbox Code Playgroud)
但是我只是将原始字符串返回.我已经尝试了re.sub和其他一些,但我似乎无法找到一种方法来改变这些字符,而不必迭代每一个.最简单的方法是什么?
aba*_*ert 14
您想使用内置编解码器unicode_escape.
如果t已经是一个bytes(8位字符串),它就像这样简单:
>>> print(t.decode('unicode_escape'))
Róisín
Run Code Online (Sandbox Code Playgroud)
如果t已经解码为Unicode,则可以将其编码回a bytes然后decode以这种方式编码.如果您确定所有Unicode字符都已转义,那么使用哪种编解码器进行编码实际上并不重要.否则,您可以尝试恢复原始字节字符串,但只是强制任何非编码字符进行编码更简单,也可能更安全,然后它们将与已编码的字符一起解码:
>>> print(t.encode('unicode_escape').decode('unicode_escape')
Róisín
Run Code Online (Sandbox Code Playgroud)
如果您想知道将来如何使用正则表达式执行此类操作,请注意,sub您可以传递函数而不是模式repl.并且您可以通过调用将任何十六进制字符串转换为整数int(hexstring, 16),并将任何整数转换为相应的Unicode字符chr(请注意,这是Python 2中不同的一位 - 您需要它unichr).所以:
>>> re.sub(r'(\\u[0-9A-Fa-f]+)', lambda matchobj: chr(int(matchobj.group(0)[2:], 16)), t)
Róisín
Run Code Online (Sandbox Code Playgroud)
或者,让它更清楚一点:
>>> 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
Run Code Online (Sandbox Code Playgroud)
该unicode_escape编解码器实际上处理\U,\x,\X,八进制(\066)和特殊字符(\n)序列以及公正\u,它实现适当的规则,只读取的数字相应的最大数量(4 \u,8 \U,等等,所以r'\\u22222'解码到'?2'而非''),而且很可能更多的东西我都没有想到的.但这应该给你的想法.
| 归档时间: |
|
| 查看次数: |
8530 次 |
| 最近记录: |