在 Python 中将 `r` 与字符串文字一起使用 [重复]
Posted
技术标签:
【中文标题】在 Python 中将 `r` 与字符串文字一起使用 [重复]【英文标题】:Using `r` with String Literals in Python [duplicate] 【发布时间】:2014-11-27 14:49:38 【问题描述】:我对@987654321@ 的实际作用感到有些困惑,并且无法理解与之相关的其他解释。比如s1
和s2
有什么区别:
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”类一起使用?
无法使 python split() 与 £ [重复] 一起使用