我对正则表达式很新,并尝试使用python
获取“\”字符通常我可以像这样逃避“\”
print ("\\");
print ("i am \\nit");
输出
\
i am \nit
但是当我在regX中使用它时它没有像我想的那样工作
print (re.findall(r'\\',"i am \\nit"));
并返回输出
['\\']
有人可以解释原因吗
答案 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)
除非反斜杠紧跟在结束引号之前,否则不必转义原始字符串中的反斜杠。