这是不是 Python 的一个 bug?

2017-07-30 10:30:12 +08:00
 lleon
>>> print(r'why\')

SyntaxError: EOL while scanning string literal\
>>>

正常不是应该输出 why\吗?
4115 次点击
所在节点    Python
25 条回复
wbt
2017-07-30 10:36:17 +08:00
\ 是转义符号
如果你想输出 'why\' 要用

```
print('why\\')
```
lleon
2017-07-30 10:39:13 +08:00
前面已经加 r 去掉了\的转义功能。
事实上,print('why\\')的结果是 why\\而不是 why\
lleon
2017-07-30 10:41:07 +08:00
(少写了 r )
事实上,print(r'why\\')的结果是 why\\而不是 why\
RLib
2017-07-30 10:41:45 +08:00
crayygy
2017-07-30 10:44:27 +08:00
一个单独的\ 不能放在最后
Perry
2017-07-30 10:44:39 +08:00
Specifically, a raw string cannot end in a single backslash (since the backslash would escape the following quote character).
SevnChen
2017-07-30 10:50:04 +08:00
你的右括号错了,)
lleon
2017-07-30 10:50:24 +08:00
@RLib
thanks
SevnChen
2017-07-30 10:53:20 +08:00
错了,是我看错了。
SoulSleep
2017-07-30 10:53:28 +08:00
@RLib 这个 Stack Overflow 下有个傻 x 老外....ID 感人....也不知道受了什么迫害,能在网上 bb 些没用的
mimzy
2017-07-30 11:03:33 +08:00
@SoulSleep 记得之前他岳母是轮子学员 他在 V 站也有账号的 跟本帖跑题了就不多说了
admos
2017-07-30 11:04:35 +08:00
规范上面已经有人贴了 \'是和\t 一样是特殊的字符------单引号。 解释器 会跳过它 继续找单引号 来确定这个 string 在什么时候结束,所以报错。
RLib
2017-07-30 11:40:09 +08:00
@SoulSleep 有些东西当没看见就好
RLib
2017-07-30 11:42:14 +08:00
不过你不提我确实没注意到这个问题, 可惜 V2EX 不能删
wisej
2017-07-30 12:24:44 +08:00
这个回答我觉得更清晰

https://stackoverflow.com/a/19654184/7962085
lleon
2017-07-30 12:52:48 +08:00
@wisej
C#中类似 r 前缀的 @前缀的语义简单多了:将字符中的\变成普通字符。
Console.WriteLine(@"why\"); # 输出:why\
碰到",用""表示:
C
lleon
2017-07-30 12:56:30 +08:00
接上
Console.WriteLine(@"dir ""c:\my docs""");

Python 的 r 字符串里如果有引号,还要根据里面的引号选择不同的外围引号,真麻烦
ksij
2017-07-30 13:05:03 +08:00
这样的话一条 print 语句输出一个\结束的字符就是不可能做到到事情了?
print (r “ c:\windows\”) ???
whileFalse
2017-07-30 14:03:25 +08:00
我的理解是 python 的词法分析器不能理解 r 标记,而且每当遇到反斜杠时就会把反斜杠和他后面的一个字符组成一组。
因此楼主的字符串在词法分析这一层就报错了。

其实我觉得这是个 bug 啦(从语义上来说),但是又没那么好改,只好当成特性处理了。
SuperMild
2017-07-30 14:31:20 +08:00
@whileFalse 不是这样,而是在 r''里面仍然需要用反斜杠来对引号进行转义,而这也是没办法,因为既然是用引号做字符串的起点和终点,就必须在里面对引号进行转义。只能说是这个选择不太好,其实如果用反引号( backtick )来表示 raw string 可能是个更好的选择。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/378965

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX