猿问

我如何在Python3中使用.decode('string-escape')?

我如何在Python3中使用.decode('string-escape')?

我有一些需要转义的转义字符串。我想用Python做这件事。

例如,在python2.7中,我可以这样做:

>>> "\\123omething special".decode('string-escape')'Something special'>>>

我如何在Python3中完成它?这不起作用:

>>> b"\\123omething special".decode('string-escape')Traceback (most recent call last):
  File "<stdin>", line 1, in <module>LookupError: unknown encoding: string-escape>>>

我的目标是成为一个像这样的字符串:

s\000u\000p\000p\000o\000r\000t\000@\000p\000s\000i\000l\000o\000c\000.\000c\000o\000m\000

把它变成:

"support@psiloc.com"

在进行转换之后,我将探测我的字符串是用UTF-8还是UTF-16编码的。


吃鸡游戏
浏览 4888回答 3
3回答

慕婉清6462132

你必须使用unicode_escape:>>> b"\\123omething special".decode('unicode_escape')如果你从一个str对象开始(相当于python 2.7 unicode),你需要首先编码为字节,然后解码unicode_escape。如果您需要字节作为最终结果,则必须再次编码.encode('latin1')为合适的编码(例如,如果您需要保留文字字节值;前256个Unicode代码点映射1对1)。您的示例实际上是带有转义的UTF-16数据。解码unicode_escape,返回以latin1保留字节,然后从utf-16-le(没有BOM的UTF 16小端)解码:>>> value = b's\\000u\\000p\\000p\\000o\\000r\\000t\\000@\\000p\\000s\\000i\\000l\\000o\\000c\\000.\\000c\\000o\\000m\\000'>>> value.decode('unicode_escape').encode('latin1')&nbsp; # convert to bytesb's\x00u\x00p\x00p\x00o\x00r\x00t\x00@\x00p\x00s\x00i\x00l\x00o\x00c\x00.\x00c\x00o\x00m\x00'>>> _.decode('utf-16-le') # decode from UTF-16-LE'support@psiloc.com'

噜噜哒

你不能使用unicode_escape字节字符串(或者更确切地说,你可以,但它并不总是返回与string_escapePython 2&nbsp;相同的东西) - 小心!此函数实现string_escape使用正则表达式和自定义替换逻辑。def&nbsp;unescape(text): &nbsp;&nbsp;&nbsp;&nbsp;regex&nbsp;=&nbsp;re.compile(b'\\\\(\\\\|[0-7]{1,3}|x.[0-9a-f]?|[\'"abfnrt]|.|$)') &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;replace(m): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;m.group(1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;len(b)&nbsp;==&nbsp;0: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;ValueError("Invalid&nbsp;character&nbsp;escape:&nbsp;'\\'.") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;b[0] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;i&nbsp;==&nbsp;120: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;int(b[1:],&nbsp;16) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;48&nbsp;<=&nbsp;i&nbsp;<=&nbsp;55: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;int(b,&nbsp;8) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;34:&nbsp;return&nbsp;b'"' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;39:&nbsp;return&nbsp;b"'" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;92:&nbsp;return&nbsp;b'\\' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;97:&nbsp;return&nbsp;b'\a' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;98:&nbsp;return&nbsp;b'\b' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;102:&nbsp;return&nbsp;b'\f' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;110:&nbsp;return&nbsp;b'\n' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;114:&nbsp;return&nbsp;b'\r' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;i&nbsp;==&nbsp;116:&nbsp;return&nbsp;b'\t' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;b.decode('ascii') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;UnicodeDecodeError( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'stringescape',&nbsp;text,&nbsp;m.start(),&nbsp;m.end(),&nbsp;"Invalid&nbsp;escape:&nbsp;%r"&nbsp;%&nbsp;s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bytes((v,&nbsp;)) &nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;regex.sub(replace,&nbsp;text)
随时随地看视频慕课网APP

相关分类

Python
我要回答