前提・実現したいこと
正規表現を使用して大規模なリストの中から検索をかけて一致したもの全てを出力させたいです。
この際database.txtには7000万ほどデータが含まれています。これを軽量化し高速化させる方法はありますか?
該当のソースコード
Python3
1from tqdm import tqdm 2import re 3 4with open("list.txt", "r", encoding="utf-8") as f: 5 re_list = [re.compile(i.split(" - ")[1].split(":")[-1].replace('*', '[0-9a-zA-z\-]').replace('.', '.') + ":") for i in f.read().strip().split("\n")] 6print(re_list) 7 8with open("database.txt", "r", encoding="utf-8") as f: 9 l_re_match = [] 10 database = f.read().strip().split("\n") 11 for _ in tqdm(re_list): 12 l_re_match.extend(list(set([i for i in database if _.match(i)]))) 13 14with open("output.txt", "w", encoding="utf-8") as f: 15 f.write("\n".join(l_re_match)) 16 17for i in l_re_match: 18 print(i) 19
データベース使ったら?
list.txt database.txtはそれぞれどういう内容なのでしょうか?
正規表現でスライスしようとしているようですが、それにしてはreplaceを2回も挟んだりして、ここに無駄に時間を掛けてるような気がします。
先にlist.txtに格納されている伏せ字で構成された文字列を正規表現に変換しています。
Koh********
⇣
Koh[0-9a-zA-z\-][0-9a-zA-z\-][0-9a-zA-z\-][0-9a-zA-z\-][0-9a-zA-z\-][0-9a-zA-z\-][0-9a-zA-z\-][0-9a-zA-z\-]
⇣
KohnoseLami
といったふうに一度伏せ字を正規表現に変換してそれを使用してdatabaseから抽出しています。
これを高速でやる方法が見当たらず質問させていただきました
これがpythonの学習目的ではなく、実務上の要請なのだとすると、grepとかsedとか使ったほうがずっと高速じゃないですかね。
なるほど...
そうですね、私がかけるのがPython、PHPくらいなのでPythonでやろうと考えていましたがやはりそういった言語やMySQLでデータベースを構築してしまったほうが早いですかね...
データベース化するにしてもSQLで処理できるような形にまずは加工しないわけにはいかないでしょう。抽出作業を高速化したいということですから、これは前処理の問題です。
ところで、OSは何でしょうか。
Windowsです