📜  防止Python中的转义序列解释

📅  最后修改于: 2022-05-13 01:54:22.341000             🧑  作者: Mango

防止Python中的转义序列解释

转义序列是字符组合(通常以转义字符为前缀),具有非文字字符解释。这样,被认为是转义序列的字符序列具有不同于其中包含的字面量字符的含义。大多数编程语言使用反斜杠 \作为转义字符。此字符用作转义序列启动器,任何跟在此之后的字符(一个或多个)都被解释为转义序列。如果将转义序列指定给不可打印字符或控制代码,则该序列称为控制字符。

Python中的转义序列列表:

Escape CharacterMeaning
\’Single quote
\”Double quote
\\backslash
\n New line
\rCarriage Return
\tHorizontal tab
\bBackspace
\fform feed
\vvertical tab
\0Null character
\N{name}Unicode Character Database named Lookup
\uxxxxxxxxUnicode Character with 16-bit hex value XXXX
\UxxxxxxxxUnicode Character with 32-bit hex value XXXXXXXX
\oooCharacter with octal value OOO
\xhhCharacter with hex value HH

上表适用于Python编程语言,因为不同的语言有不同的控制序列和控制字符,所以上表可能不适用于您选择的编程语言。前任。 Windows 命令行解释器使用插入符号 ( ^ ) 转义字符,因此上表不适用于那里。

转义序列解释

当在字符串中遇到反斜杠时,完成转义序列解释。在遇到反斜杠(在字符串内)之后,任何后续字符(带有 ( \ ))都将在上述表格中查找。如果找到匹配项,则从字符串中省略该序列,并使用与该序列关联的翻译。如果未找到匹配项,则不进行查找,并按原样复制控制序列。

例子

Python3
# A string with a recognized escape sequence
print("I will go\tHome")
 
# A string with a unrecognized escape sequence
print("See you\jtommorow")


Python3
# sample string
s = "I love to use \t instead of using 4 spaces"
 
# normal output
print(s)
 
# doubling line backslashes
s = "I love to use \\t instead of using 4 spaces"
 
# output after doubling
print(s)


Python3
s = "C:\Program Files\norton\appx"
 
# normal output
print(s)
 
# changing the string into a raw string
s = r"C:\Program Files\norton\appx"
 
# Outputting the raw versio of the string
print(s)


Python3
print("C:\Users\Desktop\JSON")


输出:

I will go    Home
See you\jtommorow

如上面的输出所示,第一个打印语句产生了一个输出,其中\t被解析为一个垂直制表符,并在输出中被省略。另一方面,在第二个打印语句中, \j仍然存在,因为该序列不存在合法的解决方案。

防止转义序列解释

在某些情况下,我们不希望字符串以这种方式运行。在这些情况下,我们通常希望保留反斜杠。可能需要这样做的一些情况是:

  • 字符串包含网络或本地路径
  • 字符串包含正则表达式,将由正则表达式引擎进一步处理

预防方法

方法一:

始终将反斜杠加倍,也使我们能够克服这些问题。在此方法中,我们手动查找字符串中的每个反斜杠,并将另一个反斜杠连接到它(在其直接位置)。通常,这是一种繁琐的方法,并且仅在字符串大小较小时才建议使用。

Python3

# sample string
s = "I love to use \t instead of using 4 spaces"
 
# normal output
print(s)
 
# doubling line backslashes
s = "I love to use \\t instead of using 4 spaces"
 
# output after doubling
print(s)

输出:

I love to use      instead of using 4 spaces
I love to use \t instead of using 4 spaces

方法二:

使用r'….'R'......'构造。通常称为原始字符串,用于将转义序列保存为字面量。这样它就可以自动执行之前的方法(不需要人工干预)。要将普通字符串转换为原始字符串,请在字符串(引号前)前加上rR。这是克服此转义序列问题的首选方法。

Python3

s = "C:\Program Files\norton\appx"
 
# normal output
print(s)
 
# changing the string into a raw string
s = r"C:\Program Files\norton\appx"
 
# Outputting the raw versio of the string
print(s)

输出:

C:\Program Files
ortonppx
C:\Program Files\norton\appx

由于转义字符引起的问题可能并不总是导致不希望的输出,但也会导致错误。例如,下面的代码在执行时会产生错误。

Python3

print("C:\Users\Desktop\JSON")

产生以下错误

导致该错误的原因是字符串中的\U导致接下来的 4 个字符被视为 32 位十六进制值,该值对应于 Unicode 代码点。这会导致错误,因为下一个字符是s超出基数 16 范围。