V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lleon
V2EX  ›  Python

这是不是 Python 的一个 bug?

  •  
  •   lleon · 2017-07-30 10:30:12 +08:00 · 4279 次点击
    这是一个创建于 2672 天前的主题,其中的信息可能已经有所发展或是发生改变。
    >>> print(r'why\')

    SyntaxError: EOL while scanning string literal\
    >>>

    正常不是应该输出 why\吗?
    25 条回复    2017-07-31 11:40:28 +08:00
    wbt
        1
    wbt  
       2017-07-30 10:36:17 +08:00
    \ 是转义符号
    如果你想输出 'why\' 要用

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

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

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

    其实我觉得这是个 bug 啦(从语义上来说),但是又没那么好改,只好当成特性处理了。
    SuperMild
        20
    SuperMild  
       2017-07-30 14:31:20 +08:00   ❤️ 1
    @whileFalse 不是这样,而是在 r''里面仍然需要用反斜杠来对引号进行转义,而这也是没办法,因为既然是用引号做字符串的起点和终点,就必须在里面对引号进行转义。只能说是这个选择不太好,其实如果用反引号( backtick )来表示 raw string 可能是个更好的选择。
    ysc3839
        21
    ysc3839  
       2017-07-30 23:29:27 +08:00 via Android
    @ksij print(r"test" + "\\")
    zhangmiaoCHN
        22
    zhangmiaoCHN  
       2017-07-31 09:00:23 +08:00
    根本原因是 \" 和 \' ,这两个与 \t 和 \n 一样,是转义字符。
    实际上,这的确是语言的一个 Bug,只不过被洗白成了特性。
    zhuangzebo0
        23
    zhuangzebo0  
       2017-07-31 09:25:55 +08:00
    不算,正确的应该是 r'why\\'.
    \把'转义了。
    araraloren
        24
    araraloren  
       2017-07-31 11:39:42 +08:00
    也许设计的时候没考虑到,于是把这个写到文档里面变成了一个例外。。
    类似于,Perl 6 的 Q 无视任何转义字符

    say Q{There is a backslash in the end \}; #
    araraloren
        25
    araraloren  
       2017-07-31 11:40:28 +08:00
    接上文 ~~ 漏了个 C#
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5720 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:25 · PVG 14:25 · LAX 22:25 · JFK 01:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.