如何在python中转义“\”字符

时间:2012-04-27 11:02:03

标签: python regex

我对正则表达式很新,并尝试使用python

获取“\”字符

通常我可以像这样逃避“\”

print ("\\");
print ("i am \\nit");

输出

\
i am \nit

但是当我在regX中使用它时它没有像我想的那样工作

print (re.findall(r'\\',"i am \\nit"));

并返回输出

['\\']

有人可以解释原因吗

4 个答案:

答案 0 :(得分:13)

编辑:问题是实际上 print如何使用列表&字符串。它打印字符串的表示形式,而不是字符串本身,只包含反斜杠的字符串的表示形式为'\\'。所以findall实际上正确地找到了单个反斜杠,但是print并没有按照您的预期打印它。尝试:

>>> print(re.findall(r'\\',"i am \\nit")[0])
\

(以下是我的原始答案,它可以被忽略(它完全无关紧要),我最初误解了这个问题。但它似乎已被推翻了一点,所以我会留在这里。)

字符串上的r前缀表示字符串处于“原始”模式,即\不被视为特殊字符(它与“正则表达式”没有任何关系) )。

但是,r'\'不起作用,因为您无法使用反斜杠it's stated in the docs结束原始字符串:

  

即使在原始字符串中,字符串引号也可以使用反斜杠进行转义,但反斜杠仍保留在字符串中;例如,r“\”“是一个有效的字符串文字,由两个字符组成:反斜杠和双引号; r”\“不是有效的字符串文字(即使原始字符串也不能以奇数个反斜杠结尾)。具体来说,原始字符串不能以单个反斜杠结尾(因为反斜杠会转义以下引号字符)。

但实际上你可以使用非原始字符串来获得单个反斜杠:"\\"

答案 1 :(得分:1)

  

有人可以解释原因吗

因为re.findall找到了一个匹配项,并且匹配文本由反斜杠组成。它给你一个包含一个元素的列表,这是一个字符串,它有一个字符,这是一个反斜杠。

这是['\\']写的,因为'\\'是你写“带有一个反斜杠的字符串”的方式 - 就像你编写示例代码print "\\"时必须要做的那样。

答案 2 :(得分:0)

请注意,您在这里使用了两种不同的字符串文字 - 常规字符串"a string"和原始字符串r"a raw string"。常规字符串文字观察反斜杠转义,因此要在字符串中实际放置反斜杠,您也需要将其转义。原始字符串文字会像任何其他字符一样处理反斜杠,因此您可以更加局限于实际可以放入字符串的字符(没有需要转义码的特殊字符),但是更容易输入正则表达式之类的东西,因为您没有如果你需要添加反斜杠以在字符串中有意义,而不仅仅是在创建字符串时,需要加倍反斜杠。

答案 3 :(得分:-1)

除非反斜杠紧跟在结束引号之前,否则不必转义原始字符串中的反斜杠。