2012-03-03 5 views
3

を持つ大規模なテキストファイルを検索する:もちろんPythonの3:私は正規表現を持つ大規模なテキストファイルを検索したいとセットアップ次のコードを持っているREGEX

import re 

regex = input("REGEX: ") 

SearchFunction = re.compile(regex) 

f = open('data','r', encoding='utf-8') 

result = re.search(SearchFunction, f) 

print(result.groups()) 

f.close() 

、これは、第二のために動作しません。 re.searchの引数は文字列またはバッファでなければなりません。しかし、私はそれが長すぎる(それは永遠にかかることを意味する)ので、文字列に私のテキストファイルのすべてを挿入することはできません。代替手段は何ですか?

+0

[Python regex parse stream]の複製が可能です(http://stackoverflow.com/questions/4634376/python-regex-parse-stream) – Joe

+1

ファイルがローカルドライブにあり、使用可能なメモリより大きくないと仮定しますファイルの読み込みには、正規表現を実行するよりも大幅に時間がかかります。あなたは実際に全部を最初に読もうとしましたか? – beerbajay

+0

@beerbajay、CPUはHDDよりも速く文字列を処理できます。シンプルな式は、ディスクから読み込むよりも速く実行されます。 (あなたがかなり速いSSD/RAID上にいない限り)。 – Qtax

答えて

6

パターンが各行に一致するかどうかを確認します。これは、メモリにファイル全体をロードしません。

for line in f: 
    result = re.search(SearchFunction, line) 
+0

[これは私の新しいコードになりますか?](http://pastie.org/3511298)問題は次のとおりです。私の印刷結果はちょうど '()'です。 11行目を 'print(result)'に変更するだけで、 '<_sre.SRE_Match object at 0x0000000002A73648>'のようなものが返されます。実際に11行目が正しい結果を出すにはどうすればよいですか? –

+0

ファイルが大きなバイナリファイル(テキストベースの行ではない)である場合は、一度にその一部を読み込んで正規表現することができます。 – 01100110

+1

@Secator:行ごとに正規表現を一致させるこの方法には問題があります。正規表現が2行以上の行にマッチするようなものならどうなりますか?このようなもの - http://pastie.org/3511422(その正規表現はいつか私のもとで作られたもので、あなたのコードはそのような場合にはうまくいきません) –

4

あなたはmmapモジュールとメモリマップファイルを使用することができます。それを文字列(またはStringIOの反対側)に見せかけたファイルと考えてください。このPython Module of the Week article about mmapの例をDoug Hellmanが見つけることができます。

関連する問題