我看到以下现象,似乎无法弄清楚,并没有通过档案搜索找到任何东西:
如果我输入:
>>> if re.search(r'\n',r'this\nis\nit'):<br>
... print 'found it!'<br>
... else:<br>
... print "didn't find it"<br>
...
Run Code Online (Sandbox Code Playgroud)
我会得到:
didn't find it!
Run Code Online (Sandbox Code Playgroud)
但是,如果我输入:
>>> if re.search(r'\\n',r'this\nis\nit'):<br>
... print 'found it!'<br>
... else:<br>
... print "didn't find it"<br>
...
Run Code Online (Sandbox Code Playgroud)
然后我会得到:
found it!
Run Code Online (Sandbox Code Playgroud)
(第一个在r'\n'上只有一个反斜杠,而第二个在r'\\n'上连续有两个反斜杠......即使这个解释器正在删除其中一个.)
我可以猜到正在进行,但我不明白为什么会发生这种情况的官方机制:在第一种情况下,我需要逃避两件事:正则表达式和特殊字符串."Raw"让我逃避特殊字符串,但不是正则表达式.
但是第二个字符串中永远不会有正则表达式,因为它是匹配的字符串.所以只需要逃脱一次.
但是,某些东西对我来说似乎并不一致:我怎么能确保在第一种情况下字面上的字符确实是真的?我可以输入rr''吗?或者我必须确保我逃避两次?在类似的情况下,我如何确保变量是按字面意思(或不是字面意义)?例如,如果我有一个变量tmp ='this \nis \nmy \nhome',我真的想找到斜杠和'n'的文字组合,而不是换行符怎么办?
谢谢!
麦克风
re.search(r'\n', r'this\nis\nit')
Run Code Online (Sandbox Code Playgroud)
正如您所说,“第二个字符串中永远不会有正则表达式。” 因此,我们需要以不同的方式看待这些字符串:第一个字符串是正则表达式,第二个字符串只是一个字符串。通常,第二个字符串不是原始字符串,因此任何反斜杠都是 Python 转义符,而不是正则表达式转义符。
因此第一个字符串由文字“\”和“n”组成。正则表达式解析器将其解释为换行符(文档:“正则表达式解析器也接受 Python 字符串文字支持的大多数标准转义”)。所以你的正则表达式将搜索换行符。
第二个字符串由字符串“this”后跟文字“\”和“n”组成。所以这个字符串不包含实际的换行符。您的正则表达式将不匹配。
至于你的第二个正则表达式:
re.search(r'\\n', r'this\nis\nit')
Run Code Online (Sandbox Code Playgroud)
此版本匹配是因为您的正则表达式包含三个字符:一个文字“\”、另一个文字“\”和一个“n”。正则表达式解析器将两个斜杠解释为单个“\”字符,后跟“n”。因此,您的正则表达式将搜索“\”,后跟“n”,这是在字符串中找到的。但这并不是很有帮助,因为它与换行符无关。
最有可能的是,您想要从第二个字符串中删除r,从而将其视为普通的 Python 字符串。
re.search(r'\n', 'this\nis\nit')
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您的正则表达式(和以前一样)正在搜索换行符。并且,它找到了它,因为第二个字符串包含单词“this”,后跟换行符。