如何正确解码以十进制编写的字符串中的转义序列
How to decode escape sequence in string written in decimal properly
我有一段代码,其中包含以十进制形式编写的带有 UTF-8 转义序列的字符串,例如
my_string = "Hello5"
然后应解释为
Hello#
我不介意解析十进制值,到目前为止,我已经对整个字符串使用了类似的东西,这似乎效果最好(没有错误并且做了一些事情):
print(codecs.escape_decode(my_string)[0].decode("utf-8"))
但是编号似乎很不对,因为我必须使用 \043 转义序列才能正确解码 hastag (#),所有其他字符也是如此。
您无法明确地检测并替换字符串文字中的所有 \ooo
转义序列,因为在您的第一行代码之前,这些转义序列将不可挽回地替换为它们对应的字符值 运行秒。就 Python 而言,"foo1"
和 "foo!"
是 100% 相同的,并且无法确定前一个对象是用转义序列定义的,而后者不是。
如果您对输入数据的形式有一定的灵活性,那么您仍然可以做您想做的事。例如,如果您被允许使用原始字符串而不是常规字符串,那么 r"Hello5"
将不会在 运行 时间之前被解释为 "Hello, followed by a hash tag"。它将被解释为 "Hello, followed by backslash, followed by 0 3 and 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"Hello5",
r"foo1",
r"The 0quick1 brown fox jumps over the 5lazy dog"
]
for s in test_strings:
result = replace_decimal_escapes(s)
print("input: ", s)
print("output: ", result)
结果:
input: Hello5
output: Hello#
input: foo1
output: foo)
input: The 0quick1 brown fox jumps over the 5lazy dog
output: The (quick) brown fox jumps over the #lazy dog
作为奖励,如果您通过 input()
获取输入字符串,此方法也适用,因为用户在该提示中键入的反斜杠不会被解释为转义序列。如果您执行 print(replace_decimal_escapes(input()))
并且用户键入 "Hello5",则输出将是所需的 "Hello#"。
我有一段代码,其中包含以十进制形式编写的带有 UTF-8 转义序列的字符串,例如
my_string = "Hello5"
然后应解释为
Hello#
我不介意解析十进制值,到目前为止,我已经对整个字符串使用了类似的东西,这似乎效果最好(没有错误并且做了一些事情):
print(codecs.escape_decode(my_string)[0].decode("utf-8"))
但是编号似乎很不对,因为我必须使用 \043 转义序列才能正确解码 hastag (#),所有其他字符也是如此。
您无法明确地检测并替换字符串文字中的所有 \ooo
转义序列,因为在您的第一行代码之前,这些转义序列将不可挽回地替换为它们对应的字符值 运行秒。就 Python 而言,"foo1"
和 "foo!"
是 100% 相同的,并且无法确定前一个对象是用转义序列定义的,而后者不是。
如果您对输入数据的形式有一定的灵活性,那么您仍然可以做您想做的事。例如,如果您被允许使用原始字符串而不是常规字符串,那么 r"Hello5"
将不会在 运行 时间之前被解释为 "Hello, followed by a hash tag"。它将被解释为 "Hello, followed by backslash, followed by 0 3 and 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"Hello5",
r"foo1",
r"The 0quick1 brown fox jumps over the 5lazy dog"
]
for s in test_strings:
result = replace_decimal_escapes(s)
print("input: ", s)
print("output: ", result)
结果:
input: Hello5
output: Hello#
input: foo1
output: foo)
input: The 0quick1 brown fox jumps over the 5lazy dog
output: The (quick) brown fox jumps over the #lazy dog
作为奖励,如果您通过 input()
获取输入字符串,此方法也适用,因为用户在该提示中键入的反斜杠不会被解释为转义序列。如果您执行 print(replace_decimal_escapes(input()))
并且用户键入 "Hello5",则输出将是所需的 "Hello#"。