非常に大きな文字列の中で多数のサブストリングを置き換える最速の方法を探しています。私が使った2つの例を以下に示します。検索と置換のための最速のPythonメソッド
findall()はよりシンプルで洗練されていますが、時間がかかります。
finditer()は大きなファイルを飛ばしますが、これが正しい方法であるかどうかはわかりません。
ここにいくつかのサンプルコードがあります。私が興味を持っている実際のテキストは、サイズが約10MBの単一文字列であり、これらの2つの方法には大きな違いがあることに注意してください。試験に
import re
def findall_replace(text, reg, rep):
for match in reg.findall(text):
output = text.replace(match, rep)
return output
def finditer_replace(text, reg, rep):
cursor_pos = 0
output = ''
for match in reg.finditer(text):
output += "".join([text[cursor_pos:match.start(1)], rep])
cursor_pos = match.end(1)
output += "".join([text[cursor_pos:]])
return output
reg = re.compile(r'(dog)')
rep = 'cat'
text = 'dog cat dog cat dog cat'
finditer_replace(text, reg, rep)
findall_replace(text, reg, rep)
UPDATE追加しましre.sub方法:
def sub_replace(reg, rep, text):
output = re.sub(reg, rep, text)
return output
結果
re.sub() - 0:00:00.031000
finditer() - 0 :00:00.109000
findall() - 0:01:17.260000
を2つ目は本当にはるかに高速ですか?私には不思議そうだ、彼らは約を取るべきである。同じ時間。そして私は両方の方法が正しいと思います。 –
なぜreのサブメソッドを使っていないのですか? –
+ =を文字列とするのは、リストを作成して ""を使って結合するO(n)と比較して、O(n^2)の操作です。 –