регулярное выражение re.findall зависает или очень медленно

Мой входной файл представляет собой большой txt-файл с объединенными текстами, которые я получил из открытой текстовой библиотеки. Теперь я пытаюсь извлечь только содержание самой книги и отфильтровать другие вещи, такие как заявления об отказе от ответственности и т. д. Итак, у меня около 100 документов в моем большом текстовом файле (около 50 МБ).

Затем я определил начальный и конечный маркеры самого содержимого и решил использовать регулярное выражение Python, чтобы найти все, что находится между начальным и конечным маркером. Подводя итог, регулярное выражение должно искать начальный маркер, затем сопоставлять все после него и прекращать поиск после достижения конечного маркера, а затем повторять эти шаги до тех пор, пока не будет достигнут конец файла.

Следующий код работает безупречно, когда я загружаю в него небольшой файл размером 100 КБ:

import codecs
import re

outfile = codecs.open("outfile.txt", "w", "utf-8-sig")
inputfile = codecs.open("infile.txt", "r", "utf-8-sig")
filecontents = inputfile.read()
for result in re.findall(r'START\sOF\sTHE\sPROJECT\sGUTENBERG\sEBOOK.*?\n(.*?)END\sOF\THE\sPROJECT\sGUTENBERG\sEBOOK', filecontents, re.DOTALL):
    outfile.write(result)
outfile.close()

Когда я использую эту операцию регулярного выражения для моего большого файла, она ничего не делает, программа просто зависает. Я протестировал его на ночь, чтобы убедиться, что он просто медленный, и даже примерно через 8 часов программа все еще зависала.

Я совершенно уверен, что источником проблемы является (.*?) часть регулярного выражения в сочетании с re.DOTALL. Когда я использую подобное регулярное выражение на меньших расстояниях, скрипт будет работать быстро и хорошо. Теперь мой вопрос: почему это просто замораживает все? Я знаю, что тексты между разделителями не маленькие, но файл размером 50 МБ не должен быть слишком большим, верно? Возможно, я пропустил более эффективное решение?

Заранее спасибо.

5
задан sirio0816 28 March 2012 в 00:25
поделиться