如何解释逃避特殊字符的奇怪行为?

时间:2012-06-26 18:11:39

标签: python

为了好玩,我写了这个简单的函数来反转Python中的字符串:

def reverseString(s):
    ret = ""
    for c in s:
        ret = c + ret
    return ret

现在,如果我传入以下两个字符串,我会得到有趣的结果。

print reverseString("Pla\net")
print reverseString("Plan\et")

这是

的输出
te
alP
te\nalP

我的问题是:为什么特殊字符\n在传入函数时会被转换为新行,但是当函数通过反转n\将它解析在一起时却不会?另外,我怎么能阻止该函数解析\n而是返回n\

3 个答案:

答案 0 :(得分:4)

你应该看看各个字符序列,看看会发生什么:

>>> list("Pla\net")
['P', 'l', 'a', '\n', 'e', 't']
>>> list("Plan\et")
['P', 'l', 'a', 'n', '\\', 'e', 't']

正如您所看到的,\n是单个字符,而\e是两个字符,因为它不是有效的转义序列。

要防止这种情况发生,请转义反斜杠本身,或使用原始字符串:

>>> list("Pla\\net")
['P', 'l', 'a', '\\', 'n', 'e', 't']
>>> list(r"Pla\net")
['P', 'l', 'a', '\\', 'n', 'e', 't']

答案 1 :(得分:2)

原因是'\ n'是字符串中的单个字符。我猜测\ e不是一个有效的逃脱,所以它被视为两个字符。

查看原始字符串以查找所需内容,或者只使用'\\',无论您何时想要文字'\'

答案 2 :(得分:1)

转换是python语法的一个功能,所以它只发生在python解析python本身的输入时(即当python解析代码时)。它不会在其他时间发生。

对于你的程序,你有一个字符串,当它被构造为一个对象时,包含由'\n'表示的单个字符,以及一个字符串,当构造时包含子字符串{{ 1}}。在你反转它们之后,python不会重新解析它们。