Pythonで.txtファイルを開いて、ファイルにあるとおりの正確な文字列を取得するにはどうすればよいですか?
正規表現を含むテキストファイルがあります。例:
\\*(.*?)\\n
Pythonでファイルを開くと:
open('regEx.txt', 'r')
私が得ている:
\\\\*(.*?)\\\\n
このファイルを開いて、ファイルに書き込まれているとおりに文字列を取得する方法はありますか?
ほとんどの場合、ファイル内のデータとまったく同じようにデータを取得しています(行末を除いて、ここでは問題ではありません)。問題は、そのデータの表示だけです。シェルで作業していますか?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を使用していると思います。その場合、メモリ内に上記の文字列を作成するには、コードで円記号を2倍にする必要があります。
"\\*(.*?)\\n"
これは、それらを2倍にしないと、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'
改行(これは私のせいですが、ファイルに入れました)を除けば、内部的には同じです。