我不明白原始字符串文字是如何工作的。我知道在使用z
时它会忽略所有特殊内容,例如在执行r
时它会将其视为\ n而不是新行。但后来我试着这样做:
\n
它说x = r'\'
而不是'\'
为什么呢?我没弄错吗? 还有什么解释:
SyntaxError: EOL while scanning string literal
答案 0 :(得分:6)
在原始文字中,反斜杠将转义定义字符串的引号字符。
字符串引号可以使用反斜杠转义,但反斜杠 留在字符串中;例如,
r"\""
是一个有效的字符串文字 由两个字符组成:反斜杠和双引号;r"\"
是 不是有效的字符串文字(即使是原始字符串也不能以奇数结尾) 反斜杠的数量)。具体来说,原始字符串不能以a结尾 单反斜杠(因为反斜杠会逃避以下引用 字符)。另请注意,单行反斜杠后跟换行符 解释为这两个字符作为字符串的一部分,而不是作为一个 延续线。
来自the docs
答案 1 :(得分:5)
将单引号放入以单引号开头的字符串的唯一方法是逃避它。因此,当您使用未转义的反斜杠后跟引号字符时,原始和常规字符串文字都将允许转义引号字符。由于要求必须有一种方法来表示以单引号(或双引号)开头的字符串文字中的单引号(或双引号),因此字符串文字'\'
不合法,无论您是使用原始还是常规string literal。
要获得具有奇数个文字反斜杠的任意字符串,我认为最好的方法是使用常规字符串文字。这是因为尝试使用r'\\'
会有效,但它会为您提供一个包含两个反斜杠的字符串,而不是一个:
>>> '\\' # A single literal backslash.
'\\'
>>> len('\\')
1
>>> r'\\' # Two literal backslashes, 2 is even so this is doable with raw.
'\\\\'
>>> len(r'\\')
2
>>> '\\'*3 # Three literal backslashes, only doable with ordinary literals.
'\\\\\\'
>>> len('\\'*3)
3
这个答案只是为了补充另一个。