字符串转义字符

时间:2014-06-16 03:41:11

标签: python string

有人可以解释以下内容:

In [9]: str( """w'o"w""") 
Out[9]: 'w\'o"w'

为什么双引号无法逃脱?无论有没有逃脱它都会做同样的事情:

In [10]: print ( 'w\'o"w') 
w'o"w

In [11]: print ( 'w\'o\"w') 
w'o"w

在以下两种情况下,没有逃脱:

In [12]: str( """w'o'w""")
Out[12]: "w'o'w"

In [13]: str( """w"o"w""")
Out[13]: 'w"o"w'

但它们仍然等同于它们的转义版本:

In [14]: str("w\'o\'w")
Out[14]: "w'o'w"

In [15]: str( "w\"o\"w") 
Out[15]: 'w"o"w'

有人可以向我解释为什么Python会出现这种“不一致”吗?拥有它们的优点是什么?

3 个答案:

答案 0 :(得分:4)

当Python控制台(包括IPython)显示字符串的值时,它会通过打印字符串的repr()来实现。 repr()将生成可由Python解析器解析的输出,因此必要时将包含反斜杠转义。 (并且只在必要时)。如果字符串中的所有引号都是单引号,repr()将显示带有双引号的字符串,不需要反斜杠。如果字符串中的所有引号都是双引号,repr()将显示带有单引号的字符串,不需要反斜杠。如果字符串包含混合的单引号和双引号,则需要反斜杠。

至于print()来电的内容 - 他们没有打印字符串的repr(),他们会显示str()的{​​{1}}值该字符串,这是字符串本身没有添加反斜杠转义(并且没有引号)。

所以,这是你的每个例子中发生的事情:

In [9]: str( """w'o"w""") 
Out[9]: 'w\'o"w'

您正在获取字符串w'o"w的值,而IPython正在输出中显示。所以它在值上调用repr(),它在它周围加上引号和反斜杠。

In [10]: print ( 'w\'o"w') 
w'o"w

您正在打印字符串w'o"w,而不是获取其值。所以IPython正在显示打印的字符串。请注意,没有Out[10] - print()函数返回None,而IPython在None时会抑制输出值。

In [11]: print ( 'w\'o\"w') 
w'o"w

同样的事情:你打印字符串,而不是IPython显示你的价值。因此它使用str(),而不是repr()

In [12]: str( """w'o'w""")
Out[12]: "w'o'w"

这里显示的是字符串的值,因此它会引用它的引号。但没有反斜杠,因为它们不需要代表字符串。

In [13]: str( """w"o"w""")
Out[13]: 'w"o"w'

同上:没有反斜杠,因为他们不需要代表字符串。

In [14]: str("w\'o\'w")
Out[14]: "w'o'w"

同上:repr()输出中没有反斜杠,因为它们不需要代表字符串。

In [15]: str( "w\"o\"w") 
Out[15]: 'w"o"w'

同样在这里:repr()输出中没有反斜杠,因为它们不需要代表字符串。

我希望这可以帮助您了解更好的内容。

答案 1 :(得分:0)

当你用single quotes括起一个字符串时,你需要转义字符串中的single quotes - 否则解释器将如何知道字符串是否要结束?

相反,当你用double quotes括起一个字符串时,你需要转义字符串中的double quotes

封闭引号的

"""是一个例外 - 它足够聪明,可以根据所包含字符串的内容来改变它的行为。如果您包含一个包含单引号的String,它的行为就像您用双引号括起来一样。如果你附上一个包含双引号的字符串,if就像你用单引号括起来一样

答案 2 :(得分:0)

你必须逃避字符串字符的开头/结尾的唯一原因是编译器/解释器知道该符号并不意味着字符串范围的开始/结束。

因此,如果字符为',则'会成为特殊字符,"则不会。反之亦然。如果你用'''"""(多行字符串)启动它,那么两个字符都不是特殊的,因此也不需要转义。