在 Python 中将 `r` 与字符串文字一起使用 [重复]

Posted

技术标签:

【中文标题】在 Python 中将 `r` 与字符串文字一起使用 [重复]【英文标题】:Using `r` with String Literals in Python [duplicate] 【发布时间】: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 视为换行符,而在第一个字符串中则不是 【参考方案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'

【讨论】:

以上是关于在 Python 中将 `r` 与字符串文字一起使用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中将 fread 与 foreach 和 doParallel 一起使用

如何在 R 中将“foreach”和“%dopar%”与“R6”类一起使用?

在 Excel 中将日期与字符串连接起来

无法使 python split() 与 £ [重复] 一起使用

python 在Python 3中将StringIO与csv模块一起使用的示例。

在 Linux 中将 boost-python 与 C++ 一起使用