【问题标题】:Why can't I end a raw string with a backslash? [duplicate]为什么我不能用反斜杠结束原始字符串? [复制]
【发布时间】:2012-06-25 10:53:15
【问题描述】:

我在这里感到困惑,即使原始字符串将每个 \ 转换为 \\,但是当这个 \ 最后出现时,它会引发错误。

>>> r'so\m\e \te\xt'
'so\\m\\e \\te\\xt'

>>> r'so\m\e \te\xt\'
SyntaxError: EOL while scanning string literal

更新:

现在Python FAQs 也涵盖了这一点:Why can’t raw strings (r-strings) end with a backslash?

【问题讨论】:

    标签: python string rawstring


    【解决方案1】:

    你仍然需要\ 来转义原始字符串中的'",否则python 解释器不知道字符串在哪里停止。在您的示例中,您正在逃避结束 '

    否则:

    r'it wouldn\'t be possible to store this string'
    r'since it'd produce a syntax error without the escape'
    

    查看语法突出显示以了解我的意思。

    【讨论】:

    • 但字符串中的 \ 也应该转义它们旁边的字符,而不是简单地转换为 \\.
    • @AshwiniChaudhary:不,在原始字符串中,``only 会转义引号字符。
    • 是的,所以不允许我在代码格式中编写单个 \。;)谢谢我明白了。
    • 仍然不是单个 '\' 所以将其转换为 '\\'。
    • 这个答案不正确。 r'\'' 在 Python 3 中生成 "\\'",因此 ` 实际上并没有转义 '。在这种情况下,文档不清楚,没有转义,只是字符串文字解析出错。
    【解决方案2】:

    由于解析器的工作方式,原始字符串不能以单个反斜杠结尾(但实际上并没有转义)。解决方法是在之后添加反斜杠作为非原始字符串文字:

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

    不漂亮,但它有效。您可以添加加号以使正在发生的事情更清楚,但这不是必需的:

    >>> print(r'foo' + '\\')
    foo\
    

    【讨论】:

      【解决方案3】:

      Python 字符串分两步处理:

      1. 首先,分词器查找结束引号。它在执行此操作时识别反斜杠,但不解释它们 - 它只是查找后跟右引号的字符串元素序列,其中“字符串元素”是(不是反斜杠、右引号或换行符 - 除了换行符允许在三引号中)或(反斜杠,后跟任何单个字符)。

      2. 然后根据字符串的类型来解释字符串的内容(处理反斜杠转义)。字符串文字前的r 标志仅影响此步骤。

      【讨论】:

      • 看来 Python 扫描器将 'r' 存储为标记,然后使用 default 字符串处理规则而不是使用 baskslash 的规则继续扫描字符串被视为普通角色。这个问题在stackoverflow.com/q/30283082/3259619 讨论。
      【解决方案4】:

      引用https://docs.python.org/3.4/reference/lexical_analysis.html#literals:

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

      所以在原始字符串中,反斜杠不会被特殊处理,除了"'之前。因此,r'\'r"\" 不是有效字符串,因为右引号被转义,从而使字符串文字无效。在这种情况下,r 是否存在没有区别,即r'\' 等价于'\'r"\" 等价于"\"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 2019-01-17
        • 2022-01-25
        • 2020-08-08
        • 1970-01-01
        • 2020-03-07
        相关资源
        最近更新 更多