为什么Python的原始字符串文字不能以单个反斜杠结尾?

263

从技术上讲,任何奇数个反斜杠,如文档中所述。

>>> r'\'
  File "<stdin>", line 1
    r'\'
       ^
SyntaxError: EOL while scanning string literal
>>> r'\\'
'\\\\'
>>> r'\\\'
  File "<stdin>", line 1
    r'\\\'
         ^
SyntaxError: EOL while scanning string literal

看起来解析器应该将原始字符串中的反斜杠视为普通字符(这不就是原始字符串的用途吗?),但我可能忽略了一些明显的东西。


13
看起来现在这是一个常见问题解答。当你提出问题时可能还不是。我知道你引用的文档基本上说了同样的事情,但我只是想添加另一份文档来源。 - oob
@oob,那个文档明确解释了它们主要用于正则表达式(不应以反斜杠结尾),而不是 Windows 路径,后者应该这样做。 - Josiah Yoder
另请参阅:Python:SyntaxError:EOL while scanning string literal,了解相关的错误消息和其他常见原因。 - Karl Knechtel
14个回答

0
一些提示:
1)如果您需要操作路径中的反斜杠,则标准Python模块os.path是您的好帮手。例如:

os.path.normpath('c:/folder1/')

2) 如果你想构建带有反斜杠的字符串,但是不想在字符串末尾加上反斜杠,那么原始字符串就是你的好朋友(在字面字符串前使用'r'前缀)。例如:

r'\one \two \three'

3) 如果您需要在变量X中的字符串前缀加上反斜杠,则可以执行以下操作:

X='dummy'
bs=r'\ ' # don't forget the space after backslash or you will get EOL error
X2=bs[0]+X  # X2 now contains \dummy

4) 如果您需要创建以反斜杠结尾的字符串,则结合提示2和3:

voice_name='upper'
lilypond_display=r'\DisplayLilyMusic \ ' # don't forget the space at the end
lilypond_statement=lilypond_display[:-1]+voice_name

现在lilypond_statement包含"\DisplayLilyMusic \upper"

Python万岁!:)

n3on


1
这些回答都没有解释“为什么”,但是不应该使用#3和#4。切片和添加字符串通常是不好的实践,你应该更喜欢#3中的r'\dummy'(它可以正常工作),并且使用' '.join([r'\DisplayLilyMusic', r'\upper'])代替#4。 - cdleary
1
原因是字符串是不可变的,每个切片/连接都会创建一个新的不可变字符串对象,通常会被丢弃。最好将它们全部累加起来,并在一步中使用str.join(components)连接它们。 - cdleary
哦,糟了 - 对于#3误解了你的意思。我认为用简单的'\\' + X更好,而不是创建一个字符串再对其进行切片。 - cdleary
只需找到 os.path.normpath 就可以删除尾部反斜杠... 那么我应该如何将文件名连接到路径中呢... - Jing He

0

作为一个来自C语言的程序员,我很清楚单个反斜杠可以作为转义字符,让你在字符串中插入特殊字符,如换行符、制表符和引号。

这确实不允许\作为最后一个字符,因为它会转义引号并使解析器出错。但正如之前指出的,\是合法的。


4
是的——问题的核心在于原始字符串将\作为字面量处理,而不是转义序列的开始。奇怪的是,尽管被视为字面字符,它仍具有引用的转义特性。 - cdleary

0
尽管它的作用如此,但即使是原始字符串也不能以单个反斜杠结尾,因为反斜杠会转义后面的引号字符——您仍然必须转义周围的引号字符才能将其嵌入字符串中。也就是说,r"...\"不是有效的字符串字面值——原始字符串不能以奇数个反斜杠结尾。
如果您需要以单个反斜杠结尾原始字符串,可以使用两个反斜杠并切掉第二个。

1
你在引用什么? - Josiah Yoder
1
似乎是从https://apprize.best/python/learning_1/8.html而来,但没有归属。 - tripleee

-2
我遇到了这个问题,并找到了一个部分解决方案,适用于某些情况。尽管Python不能以单个反斜杠结尾字符串,但可以将其序列化并保存在以单个反斜杠结尾的文本文件中。因此,如果您需要在计算机上保存带有单个反斜杠的文本,则可能是可行的:
x = 'a string\\' 
x
'a string\\' 

# Now save it in a text file and it will appear with a single backslash:

with open("my_file.txt", 'w') as h:
    h.write(x)

顺便说一下,如果您使用Python的json库进行转储,则无法使用json。

最后,我使用Spyder工作,并注意到如果我在变量资源管理器中双击其名称以在spider的文本编辑器中打开变量,则会显示单个反斜杠,并且可以通过这种方式将其复制到剪贴板(对于大多数需求来说并不是很有用,但也许对某些人有帮助..)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接