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

6

我很新于正则表达式,尝试在Python中获取“\”字符。

通常我可以像这样转义“\”

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

输出

\
i am \nit

但是当我在正则表达式中使用相同的内容时,它并没有像我想象的那样起作用

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

并且把输出结果返回给我

['\\']

有人可以解释一下为什么吗?这与IT技术有关。

16
在Python中使用分号并不是一个好的实践。 - jamylak
与此问题相同,参考https://dev59.com/aXRB5IYBdhLWcg3wXWK2中的问题和答案。 - Zeugma
4个回答

17

编辑:问题实际上是关于print如何处理列表和字符串的。它打印的是字符串的表示形式,而不是字符串本身。一个只包含反斜杠的字符串的表示形式是'\\'。因此,findall实际上可以正确地找到单个反斜杠,但print没有按照您的期望打印它。请尝试:

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

字符串前缀 r 表示该字符串处于“原始”模式,即 \ 不被视为特殊字符(与“正则表达式”无关)。
但是,r'\' 是不能使用的,因为您不能以反斜杠结尾文档中已经说明

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

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


在Python 2.7中,re.compile("\\")会产生错误 error: bogus escape (end of line) - Limbo Peng
为了使用正则表达式(regex)匹配一个实际的反斜杠,你需要在正则表达式中输入两个反斜杠,再加上两个反斜杠来转义它们:re.compile("\\\\") 会生成一个可以匹配单个反斜杠的正则表达式。 - Tim Pietzcker
@LimboPeng,我之前理解错了问题,所以我的原始答案是不正确的。 - huon
@dbaupp 哎呀!我正要写同样的答案 - 有点难过 :( - Limbo Peng
Python 对字符串进行两次解析:首先确定开始引号标记并尝试找出结束引号标记 - 这样对于原始字符串中的反斜杠和引号的处理方式相同;必须这样做,否则您将无法在原始字符串中嵌入引号。在第二次解析中,解释引号之间的内容。 - Karl Knechtel

1
可以有人解释一下为什么吗?
因为re.findall找到了一个匹配项,而匹配文本由反斜杠组成。它给你一个包含一个元素的列表,该元素是一个字符串,其中只有一个字符,即反斜杠。
这被写成['\\'],因为'\\'是您编写“具有一个反斜杠的字符串”的方式 - 就像您在编写示例代码print "\\"时所做的那样。

0
请注意,您在此处使用了两种不同类型的字符串字面值--有常规字符串"a string"和原始字符串r"a raw string"。 常规字符串字面值观察反斜杠转义,因此要实际将反斜杠放入字符串中,您需要对其进行转义。 原始字符串字面值像其他字符一样处理反斜杠,因此您在实际放入字符串中的字符方面更受限制(不能使用需要转义代码的特殊字符),但是如果您需要添加反斜杠以在字符串内具有意义而不仅仅是在创建字符串时,则更容易输入诸如正则表达式之类的内容,因为您不需要加倍反斜杠。

-2

在原始字符串中,除非反斜杠紧接着引号前面,否则不需要转义反斜杠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接