如何正确解码十进制字符串中的转义序列

2024-04-23 22:09:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,其中包含用十进制编写的UTF-8转义序列的字符串,例如

my_string = "Hello\035"

应该解释为

Hello#

我不介意解析十进制值,到目前为止,我已经对整个字符串使用了这样的方法,而且这似乎是最有效的(没有错误,并且做了一些事情):

print(codecs.escape_decode(my_string)[0].decode("utf-8"))

但是编号似乎有点不对劲,因为我必须使用\043转义序列才能正确解码hastag(#),其他所有字符都是一样的。你知道吗


Tags: 方法字符串代码hellostringmy错误事情
1条回答
网友
1楼 · 发布于 2024-04-23 22:09:34

您无法明确地检测和替换字符串文字中的所有\ooo转义序列,因为在第一行代码运行之前,这些转义序列将被相应的字符值无可挽回地替换。就Python而言,"foo\041""foo!"是100%相同的,无法确定前一个对象是用转义序列定义的,而后者不是

如果您在输入数据的形式方面有一定的灵活性,那么您仍然可以做您想要做的事情。例如,如果允许使用原始字符串而不是常规字符串,则在运行时之前r"Hello\035"不会被解释为“Hello,后跟hash标记”。它将被解释为“Hello,后跟反斜杠,后跟0 3和5”。由于数字字符仍然可以访问,因此可以在代码中对其进行操作。例如

import re

def replace_decimal_escapes(s):
    return re.sub(
        #locate all backslashes followed by three digits
        r"\\(\d\d\d)",
        #fetch the digit group, interpret them as decimal integer, then get cooresponding char
        lambda x: chr(int(x.group(1), 10)), 
        s
    )

test_strings = [
    r"Hello\035",
    r"foo\041",
    r"The \040quick\041 brown fox jumps over the \035lazy dog"
]

for s in test_strings:
    result = replace_decimal_escapes(s)
    print("input:  ", s)
    print("output: ", result)

结果:

input:   Hello\035
output:  Hello#
input:   foo\041
output:  foo)
input:   The \040quick\041 brown fox jumps over the \035lazy dog
output:  The (quick) brown fox jumps over the #lazy dog

另外,如果您通过input()获取输入字符串,这种方法也可以工作,因为用户在该提示符中键入的反斜杠不会被解释为转义序列。如果执行print(replace_decimal_escapes(input())),并且用户键入“Hello\035”,那么输出将是所需的“Hello#”。你知道吗

相关问题 更多 >