误解在“”之前使用 r 删除转义字符?[复制]

Misunderstanding removing escape characters using r before ""? [duplicate]

提问人:Jmcmgaming89 提问时间:11/8/2023 最后编辑:John KugelmanJmcmgaming89 更新时间:11/8/2023 访问量:46

问:

我对使用 in print 函数删除转义字符有误解。下面对我不起作用的非常基本的例子,以及我为纠正这种情况所做的几项努力之一:r

print(r"I am trying to keep the backslash in the link using r  \www.home.com\")

SyntaxError: unterminated string literal (detected at line 19)

这是我尝试打印到控制台时出现的错误。我尝试了不同的方法来结束字符串文字。有人可以帮我理解这里发生的事情和逻辑吗?

我尝试了各种修复方法,例如:

print("\\www.home.com\\")

这确实有效,但在我的脑海中,使用之前也应该有效。r""

Example of what works:
print(r"This string would print normally if I remove the last back slash \www.home.com")
Python 转义

评论


答:

2赞 blhsing 11/8/2023 #1

这是原始字符串的一个特殊限制,即原始字符串不能以反斜杠结尾。

官方文档转义序列摘录:

即使在原始文字中,引号也可以用反斜杠转义,但是 反斜杠保留在结果中;例如,是有效的字符串 由两个字符组成的文字:反斜杠和双引号; 不是有效的字符串文字(即使是原始字符串也不能以 反斜杠的奇数)。具体来说,原始文字不能以 单个反斜杠(因为反斜杠会转义以下内容 引号字符)。r"\""r"\"

因此,在这种特殊情况下,字符串文字需要以反斜杠结尾但包含其他反斜杠,一种解决方法是将结束反斜杠写成一个单独的字符串文字,并用另一个反斜杠转义反斜杠:

print(r'C:\deeply\nested\folders' '\\')

另一种解决方法是用空格填充最后一个反斜杠,然后在运行时调用该方法将其删除:rstrip

print(r'C:\deeply\nested\folders\ '.rstrip())

可以说,这两者看起来都比用常规引号写满转义序列的整句文字更干净:

print('C:\\deeply\\nested\\folders\\')

这三种方法都产生相同的输出:

C:\deeply\nested\folders\
0赞 Reilas 11/8/2023 #2

"...我对在打印函数中使用 r 来删除转义字符有误解。..."

这称为原始字符串

以下是 Python 文档中的一些摘录。

Python 语言参考 – 2.4.1。String 和 Bytes 文本

"...字符串和字节文字都可以选择以字母或 ;此类字符串称为原始字符串,并将反斜杠视为文本字符。..."'r''R'

Python 教程 – 3.1.2.发短信

"...如果您不希望以 开头的字符被解释为特殊字符,您可以通过在第一个引号前添加 ...

。原始字符串有一个微妙的方面:原始字符串可能不会以奇数个字符结尾;有关详细信息和解决方法,请参阅常见问题解答条目。..."
\r\

代码不起作用的原因是 Python转义序列解释为文本值。
本质上是捕获后续字符。
因此,结局被认为是字面上的。
\\"

这是一个类似的问题和答案。
为什么 Python 的原始字符串文字不能以单个反斜杠结尾?

在这种情况下,只需使用常规字符串文字即可。

print("I am trying to keep the backslash in the link using r  \www.home.com\\")