当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么Python的原始字符串文字不能以单个反斜杠结尾?》经验,为你挑选了6个好方法。

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

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

似乎解析器可以将原始字符串中的反斜杠视为常规字符(不是原始字符串的全部内容吗?),但我可能遗漏了一些明显的东西.TIA!



1> oefe..:

我在粗体突出显示的那一部分解释了原因:

字符串引号可以使用反斜杠进行转义,但反斜杠仍保留在字符串中; 例如,r"\""是一个有效的字符串文字,由两个字符组成:反斜杠和双引号; r"\"不是有效的字符串文字(即使原始字符串不能以奇数个反斜杠结尾).具体来说,原始字符串不能以单个反斜杠结尾(因为反斜杠会转义以下引号字符).另请注意,后跟换行符的单个反斜杠被解释为字符串的一部分,而不是行连续符.

所以原始字符串不是100%原始的,还有一些基本的反斜杠处理.


哇哇...这太奇怪了.很好的抓住.有道理r'\''=="\\'"但是转义字符有效而不会消失仍然很奇怪.
注意:解决方法是使用相邻的文字连接.`r`foo\bar\baz""\\"`(如果不明确则包含在parens中)将在编译时创建一个文字,其中第一部分是原始的,只有最后一小部分是非原始的,到允许尾随反斜杠.
那么原始字符串有什么意义呢?似乎是该概念的幕后实现。
@ihightower这可能适用于文件系统路径,但是反斜杠还有其他用途。对于文件系统路径,请不要对分隔符进行硬编码。使用“ os.path.sep”,或者更好的使用“ os.path”的高级功能。(或“ pathlib”,如果可用)
IMO只是在重申问题(允许/将起作用,什么不起作用),而没有说为什么采用这种方式设计。有一个[FAQ条目](https://docs.python.org/3/faq/design.html#why-can-t-raw-strings-r-strings-end-with-a-反斜杠)解释原因(原始字符串是为特定目的而设计的,并且在该目的的上下文中是有意义的)。

2> Artur..:

关于python原始字符串的整个误解是,大多数人认为反斜杠(在原始字符串中)只是一个常规字符,就像所有其他字符串一样.它不是.理解的关键是这个python的教程序列:

当存在' r '或' R '前缀时,字符串中包含反斜杠后面的字符没有更改,并且所有反斜杠都保留在字符串中

因此反斜杠后面的任何字符都是原始字符串的一部分.一旦解析器输入一个原始字符串(非unicode一个)并遇到反斜杠,它就会知道有2个字符(反斜杠和后面的字符).

这条路:

r'abc\d'包括a,b,c,\,d

r'abc \'d'包括a,b,c,\,',d

r'abc \''包括a,b,c,\,'

和:

r'abc \'包含a,b,c,\,'但现在没有终止引用.

最后一个案例显示,根据文档现在,解析器无法找到结束引用,因为您在上面看到的最后一个qoute是字符串的一部分即.反斜杠不能在这里持续,因为它会"吞噬"字符串结束字符.


这实际上比接受的答案更清楚.很好的故障.
我也发现这比接受的答案更清楚,我也恰好是一名物理学家

3> hasen..:

它就是这样儿的!我认为它是python中的一个小缺陷!

我认为这不是一个很好的理由,但绝对不能解析; 用\作为最后一个字符解析原始字符串真的很容易.

问题是,如果你允许\成为原始字符串中的最后一个字符,那么你将无法将"置于原始字符串中.似乎python继续允许"而不是允许\作为最后一个字符.

但是,这不应该造成任何麻烦.

如果您担心无法轻松编写Windows文件夹路径(例如,请c:\mypath\不要担心),因为您可以将它们表示为r"C:\mypath",并且,如果您需要附加子目录名称,请不要使用字符串连接,无论如何,这不是正确的方法!使用os.path.join

>>> import os
>>> os.path.join(r"C:\mypath", "subfolder")
'C:\\mypath\\subfolder'


..或者你可以将它们表示为"c:/ mypath"并完全忘记你的反斜率的困境:-)
好的辅助材料.:-) Devil的拥护者:有时你想通过附加路径分隔符来区分文件路径和目录路径.关于os.path.join的好处是它会崩溃它们:断言os.path.join('/ home/cdleary /','foo /','bar /')=='/ home/cdleary/foo /酒吧/'
是的,它只是向读取代码的人表明您希望路径是目录还是文件.

4> 小智..:

另一个技巧是使用chr(92),因为它的计算结果为"\".

我最近不得不清理一串反斜杠,以下是诀窍:

CleanString = DirtyString.replace(chr(92),'')

我意识到这并没有关注"为什么",但线程吸引了许多人寻找解决当前问题的方法.



5> Charles Beat..:

为了让你用斜杠结束原始字符串,我建议你可以使用这个技巧:

>>> print r"c:\test"'\\'
test\



6> Brian R. Bon..:

由于在原始字符串中允许使用\",因此它不能用于标识字符串文字的结尾.

当你遇到第一个"?"时为什么不停止解析字符串文字?

如果是这种情况,那么\"将不允许在字符串文字中.但它确实如此.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有