在Python中使用`r`和String Literals

时间:2014-10-02 15:05:12

标签: python

我对r实际做了什么感到有些困惑,并且无法理解与之相关的其他解释。例如,s1s2之间有什么区别:

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

修改

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

由于

3 个答案:

答案 0 :(得分:2)

区别在于s1在“this”和“has”之间有2个反斜杠而s2只有1个。另外,s2\n处获取换行符而s1没有。如果你打印字符串,差异会变得非常明显。

基本上,在字符串文字前面有r,你看到的是你得到的 1 。如果前面没有r,python会将各种转义码(\t\n\\等)转换为不同的字符(制表符,换行符,\等)< / p>

1 我知道有1个问题...... r'\'SyntaxError ......

答案 1 :(得分:2)

你可以看到,在第一种情况下,r使它成为一个原始字符串,因此正确处理斜杠和任何控制字符(在第一种情况下,你现在有一个双斜杠),与字符串2进行比较\n现在变为新行:

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

答案 2 :(得分:0)

第一个(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'