【问题标题】:Using `r` with String Literals in Python [duplicate]在 Python 中将 `r` 与字符串文字一起使用 [重复]
【发布时间】:2014-11-27 14:49:38
【问题描述】:

我对@9​​87654321@ 的实际作用感到有些困惑,并且无法理解与之相关的其他解释。比如s1s2有什么区别:

s1 = r'this\\has\no\special\characters'

编辑:

s2 = 'this\\has\no\special\characters'

谢谢

【问题讨论】:

  • 这些是 100% 相同的,我认为您需要删除其中第一个的 r
  • 您的意思是在s2 中省略\ 吗?
  • 如果你去掉r,你会看到不同。
  • r 表示原始字符串,因此本质上特殊/控制字符不需要转义,但是如果您将其用作路径,那么我相信它不会处理斜杠,所以您需要小心
  • 您可以通过打印它们轻松判断,第二个字符串会将\n 视为换行符,而在第一个字符串中则不是

标签: python


【解决方案1】:

不同之处在于s1 在“this”和“has”之间有 2 个反斜杠,s2 只有 1 个。此外,s2\n 处选择换行符,而 s1 没有。如果您打印字符串,差异会变得非常明显。

基本上,在字符串文字前面加上r,所见即所得1。前面没有r,python会将各种转义码(\t\n\\等)翻译成不同的字符(制表符、换行符、\等)

1我知道有 1 个陷阱...r'\'SyntaxError...

【讨论】:

    【解决方案2】:

    您可以看到,在第一种情况下,r 使其成为原始字符串,因此斜杠和任何控制字符都被正确处理(在第一种情况下,您现在有一个双斜杠),与字符串 2 比较,其中 @ 987654322@ 现在变成了新的一行:

    In [218]:
    
    s1 = r'this\\has\no\special\characters'
    print(s1)
    s2 = 'this\\has\no\special\characters'
    print(s2)
    this\\has\no\special\characters
    this\has
    o\special\characters
    

    需要注意的是使用原始字符串构建路径,如果路径包含尾部反斜杠,则不会处理:

    In [220]:
    
    path = r'c:\mytemp\'
      File "<ipython-input-220-ca80e74afea4>", line 1
        path = r'c:\mytemp\'
                            ^
    SyntaxError: EOL while scanning string literal
    

    【讨论】:

      【解决方案3】:

      第一个 (s1) 是一个正则表达式集,第二个只是一个字符串!并基于python doc

      正则表达式使用反斜杠字符('\') 表示特殊形式或允许使用特殊字符而不调用其特殊含义。这与 Python 在字符串文字中出于相同目的使用相同字符相冲突;例如,要匹配文字反斜杠,可能必须将 '\\\\' 写为模式字符串,因为正则表达式必须是 \\,并且每个反斜杠必须在常规 Python 字符串文字中表示为 \\

      解决方案是对正则表达式模式使用 Python 的原始字符串表示法;在以'r' 为前缀的字符串文字中,反斜杠不会以任何特殊方式处理。所以 r"\n" 是一个包含 '\''n' 的两个字符的字符串,而 "\n" 是一个包含换行符的一个字符的字符串。通常模式将使用这种原始字符串表示法在 Python 代码中表示。 所以你有:

      >>> s1 = r'this\\has\no\special\characters'
      >>> s1
      'this\\\\has\\no\\special\\characters'
      >>> s2 = 'this\\has\no\special\characters'
      >>> s2
      'this\\has\no\\special\\characters'
      

      【讨论】:

        猜你喜欢
        • 2016-10-26
        • 1970-01-01
        • 1970-01-01
        • 2013-12-22
        • 2019-02-26
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多