解码 Python 字符串中的特定转义字符

Decoding specific escaped characters in a Python string

我有一个 Python 变量(名为 var),其中包含一个具有以下文字数据的字符串:

day\r\n\night

十六进制为:

64  61  79  5C  72  5C  6E  5C  5C  6E  69  67  68  74  07
d   a   y   \   r   \   n   \   \   n   i   g   h   t   BEL

我只需要解码 \\r\n .

所需的输出(十六进制):

64  61  79  0D  0A  5C  6E  69  67  68  74  07
d   a   y   CR  LF  \   n   i   g   h   t   BEL

使用 decode 无效:

>>> print(var.decode('ascii'))
AttributeError: 'str' object has no attribute 'decode'. Did you mean: 'encode'?

使用正则表达式查找 \\r\n 并用它们的转义值替换是不成功的,因为 \night 中的 \n 被处理作为 0x0A.

是否可以指定我想要的字符decode,或者是否有更合适的模块?我正在使用 Python 3.10.2.

查找类似问题。根据这个你可以做以下事情

var = r"day\r\n\night"

# This is what you got previously
var.encode('ascii').hex()
# '64 61 79 5c 72 5c 6e 5c 5c 6e 69 67 68 74'

# To get required output do this
bytes(var, encoding='ascii').decode('unicode-escape').encode('ascii').hex()
# '64 61 79 0d 0a 5c 6e 69 67 68 74'

假设 var 是这样的字符串:

64617905C725C6E5C5C6E69676877407(没有空格)

你应该试试:

i = 0
escaped = {'72': '0D', '6E': '0A', '5C': '5C'}
while i < len(var):
   if var[i:i+2] == '5C':                # checks if the caracter is a '\'
      i += 2                             # if yes, goes to next character hex code in var
      var[i-2:i+2] = escaped[var[i:i+2]] # replaces the '5Cxx' by its escaped value
   i += 2

它将\r \n \替换为对应的字符(CR LF \)。

我稍后会在 day\r\l\night64617905C725C6E5C5C6E696768774 之间添加转换器。

编辑: 转换器来了! 每次转换后的字符串都是r.
它处理 input() 的结果,但对于 hard-coded 字符串,您必须输入:
var = 'day\r\l\\night'
这样代码就会将其理解为 'day',然后是 '\',然后是 'r',然后是 '\',然后是 'n',然后是 '\',然后是 ' \',然后是 'night' 而不是 'day',然后是 CR,然后是 LF,然后是 '\',然后是 'night';所以
print(var)
将打印
day\r\n\night
而不是

day
\night

# convert string to hex
r = ''
for c in var:
   t = hex(ord(c))[2:]
   if ord(c) < 16: t = '0' + t
   r += t
# convert hex to string
r = ''
c = 0
while c < len(var):
   # transforms each hex code point into a decimal number
   # I kind of cheat using `eval`. But don't worry. Doesn't matter.
   # anyway, it then adds the corresponding character to `r`.
   r += eval('chr(0x' + var[c:c+2] + ')') # does like, `r += chr(0x5C)` for example.
   c += 2

非常感谢所有提供答案的人,但其中 none 似乎完全解决了我的问题。经过长时间的研究,我发现 this solution from sahil Kothiya (mirror) -- 我对其进行了修改以解决我的具体问题:

import re, codecs

ESCAPE_SEQUENCE_RE = re.compile(r'''
    ( \[\nr]  # Single-character escapes
    )''', re.UNICODE | re.VERBOSE)

def decode_escapes(s):
    def decode_match(match):
        return codecs.decode(match.group(0), 'unicode-escape')
return ESCAPE_SEQUENCE_RE.sub(decode_match, s)

空闲演示:

Notepad++ 中显示的特殊字符:

输出字符串的十六进制转储:


它甚至可以处理 Unicode 字符(我的脚本的一个重要组成部分)。

空闲演示:

Notepad++ 中显示的特殊字符:

输出字符串的十六进制转储: