6

我对正则表达式非常陌生,并尝试使用 python 获取“\”字符

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

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

输出

\
i am \nit

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

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

并返回我的输出

['\\']

有人可以解释为什么

4

4 回答 4

17

编辑:问题实际上是如何print处理列表和字符串。它打印字符串的表示,而不是字符串本身,只包含反斜杠的字符串的表示是'\\'. 所以findall实际上是正确地找到了单个反斜杠,但print没有像您期望的那样打印它。尝试:

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

(以下是我的原始答案,可以忽略(完全无关),我最初误解了这个问题。但它似乎有点被赞成,所以我把它留在这里。)

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

但是,r'\'它不起作用,因为您不能用反斜杠结束原始字符串,它在文档中说明

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

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

于 2012-04-27T11:09:49.573 回答
1

有人可以解释为什么

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

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

于 2012-04-27T12:02:22.227 回答
0

请注意,您在这里使用了两种不同的字符串文字——常规字符串"a string"和原始字符串r"a raw string"。常规字符串文字观察反斜杠转义,因此要在字符串中实际放置反斜杠,您也需要对其进行转义。原始字符串文字将反斜杠视为任何其他字符,因此您可以在字符串中实际放入哪些字符(没有需要转义码的特殊字符)受到更多限制,但输入正则表达式之类的内容更容易,因为您不需要如果您需要添加反斜杠以在字符串内部有意义,则需要加倍反斜杠,而不仅仅是在创建字符串时。

于 2012-04-27T11:08:16.663 回答
-2

没有必要在原始字符串中转义反斜杠,除非反斜杠紧接在右引号之前。

于 2012-04-27T11:04:17.853 回答