如何在 Python 中打开 .txt 文件并获取文件中的确切字符串?
我有一个包含正则表达式的文本文件,例如:
\\*(.*?)\\n
当我在 Python 中打开文件时:
open('regEx.txt', 'r')
我越来越:
\\\\*(.*?)\\\\n
有没有办法打开这个文件并完全按照文件中的内容获取字符串?
您最有可能获得与文件中完全相同的数据(可能除了行尾,但这不是问题所在)。问题仅在于该数据的显示。你在shell中工作吗?print
除非您明确使用,否则它会输出转义序列。
尝试print open('regEx.txt', 'rb').read()
甚至open('regEx2.txt','wb').write(open('regEx.txt', 'rb').read())
。regEx2.txt 将与 regEx.txt 相同。
您在这里稍微混淆了一些字符串表示。实际的正则表达式(忽略任何语言特定的奇怪之处)只是
\*(.*?)\n
(字面意思是这 9 个字符)
但是,我想您一直在使用没有原始字符串的 Java 或 Python。在这种情况下,要在内存中创建上述字符串,您的代码必须将反斜杠加倍:
"\\*(.*?)\\n"
这是因为,如果您不将它们加倍,Python 将在编译字符串时将它们删除。但是现在字符串又被编译成了这 9 个字符:\*(.*?)\n
. 如果将这些打印出来,您将获得(如 jd. 所说)包括双反斜杠的显示。但如果你打电话len(string)
它会说9
,不是11
。
所以你只需要 9 个字符。那为什么要在你的文件中写 11 呢?如果你写了 11,那么在显示时反斜杠将再次被双重转义。但是调用len(input)
. open
它会说11
,不是15
。
这也是为什么在代码中定义正则表达式时应该始终使用原始字符串的原因。然后你永远不需要任何额外的转义(引号除外):
r"\*(.*?)\n"
这将再次为您留下 9 个字符(因为反斜杠在编译字符串时保持不变)。
我不认为这是一个问题,比较以下:
»»» regex # as read from the file
Out[9]: '\\*(.*?)\\n\n'
»»» r=r'\*(.*?)\n'
»»» r
Out[11]: '\\*(.*?)\\n'
除了换行符(这是我的错,我把它放在文件中)它们在内部是相同的。