这是不是 Python 的一个 bug? - V2EX
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 4694 次点击
    这是一个创建于 2997 天前的主题,其中的信息可能已经有所发展或是发生改变。
    >>> 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     Solana     1052 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 18:30 PVG 02:30 LAX 11:30 JFK 14:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86