Я ищу самый быстрый способ заменить большое количество подстрок внутри очень большой строки. Вот два примера, которые я использовал.
findall() чувствует себя более простым и элегантным, но для этого требуется поразительное количество времени.
finditer() прорисовывается через большой файл, но я не уверен, что это правильный способ сделать это.
Вот пример кода. Обратите внимание, что фактический текст, который мне интересен, представляет собой одну строку размером около 10 МБ, и там есть огромная разница в этих двух методах.
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