我对正则表达式非常陌生,并尝试使用 python 获取“\”字符
通常我可以像这样逃避“\”
print ("\\");
print ("i am \\nit");
输出
\
i am \nit
但是当我在 regX 中使用它时,它并没有像我想象的那样工作
print (re.findall(r'\\',"i am \\nit"));
并返回我的输出
['\\']
有人可以解释为什么
编辑:问题实际上是如何print
处理列表和字符串。它打印字符串的表示,而不是字符串本身,只包含反斜杠的字符串的表示是'\\'
. 所以findall
实际上是正确地找到了单个反斜杠,但print
没有像您期望的那样打印它。尝试:
>>> print(re.findall(r'\\',"i am \\nit")[0])
\
(以下是我的原始答案,可以忽略(完全无关),我最初误解了这个问题。但它似乎有点被赞成,所以我把它留在这里。)
字符串上的r
前缀表示字符串处于“原始”模式,即\
不被视为特殊字符(它与“正则表达式”没有任何关系)。
但是,r'\'
它不起作用,因为您不能用反斜杠结束原始字符串,它在文档中说明:
即使在原始字符串中,字符串引号也可以用反斜杠转义,但反斜杠保留在字符串中;例如,r"\"" 是由两个字符组成的有效字符串文字:反斜杠和双引号;r"\" 不是有效的字符串文字(即使原始字符串也不能以奇数个反斜杠结尾)。具体来说,原始字符串不能以单个反斜杠结尾(因为反斜杠会转义后面的引号字符)。
但是您实际上可以使用非原始字符串来获取单个反斜杠:"\\"
。
有人可以解释为什么
因为re.findall
找到了一个匹配,并且匹配文本由反斜杠组成。它给了你一个包含一个元素的列表,它是一个字符串,它有一个字符,它是一个反斜杠。
之所以这样写,是['\\']
因为这是'\\'
您编写“带有一个反斜杠的字符串”的方式 - 就像您在编写示例代码时必须做的那样print "\\"
。
请注意,您在这里使用了两种不同的字符串文字——常规字符串"a string"
和原始字符串r"a raw string"
。常规字符串文字观察反斜杠转义,因此要在字符串中实际放置反斜杠,您也需要对其进行转义。原始字符串文字将反斜杠视为任何其他字符,因此您可以在字符串中实际放入哪些字符(没有需要转义码的特殊字符)受到更多限制,但输入正则表达式之类的内容更容易,因为您不需要如果您需要添加反斜杠以在字符串内部有意义,则需要加倍反斜杠,而不仅仅是在创建字符串时。
没有必要在原始字符串中转义反斜杠,除非反斜杠紧接在右引号之前。