2013-11-28 3 views
2

Использование Python 2.6.6.Выполнение инкрементного поиска регулярных выражений в огромных строках (Python)

Я надеялся, что модуль повторно при условии некоторого метода поиска, который имитировал путь str.find() работает, что позволяет указать начальный индекс, но, видимо, не ...

  • поиска() позволяет мне найти первый матч ...
  • FindAll() будет возвращать все (не перекрывающихся!) матчей одного шаблона
  • finditer() подобен FindAll(), но с помощью итератора (более эффективно)

H это ситуация ... Я добычу данных в огромных блоках данных. Для частей синтаксического анализа регулярное выражение работает отлично. Но как только я нахожу определенные соответствия, мне нужно переключиться на другой шаблон или даже использовать более специализированный синтаксический анализ, чтобы найти, где начать поиск в следующем. Если re.search позволил мне указать начальный индекс, это было бы прекрасно. Но в отсутствие этого, я смотрю на:

  1. Использование finditer(), но пропуская вперед, пока не дойду до индекса, который прошел, где я хочу возобновить использование re. Потенциальные проблемы:
    • Если встроенные двоичные данные, случается, содержат матч, который перекрывается законный матч только после того, как бинарный кусок ...
    • Поскольку я не ищу одного рисунка, я должен жонглировать несколько итераторов, которые также имеют возможность ложного совпадения, скрывающего реальный.
  2. Нарезка, т. Е. Создание копии оставшейся части данных каждый раз, когда я хочу снова выполнить поиск.
    • Это было бы надежным, но заставило бы много «ненужного» копирования на данные, которые могут быть много мегабайт.
    • Я бы предпочел сохранить его таким образом, чтобы все совпадающие местоположения были индексами в один исходный объект строки, так как я могу некоторое время на них нависнуть и хочу их сравнить. Поиск последующих совпадений в отдельных разрезанных копиях - это сложность бухгалтерского учета.
  3. Только что пришло в голову, что я могу использовать подход «вращающегося буфера», но не продумал его полностью. Это может привести к большой сложности кода.

У меня отсутствуют какие-либо очевидные альтернативы? Не уверен, будет ли способ обернуть огромную строку классом, который будет обслуживать фрагменты ... Или фрагментацию итератора или «строкового курсора» идиомы?

+0

Возможный дубликат [Python: найти регулярное выражение в файле] (http://stackoverflow.com/questions/4989198/python-find-regexp-in-a-file) –

+0

@SeanVieira: Да, сходства, но далеки от дублировать. mmap не решает проблему инкрементного поиска, а предложение, ориентированное на линию, даже хуже, чем нарезание ... –

+1

re.seaarch() имеет начальный аргумент, pos - http://docs.python.org/2.6 /library/re.html#re.RegexObject.search – wwii

ответ

3

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

+0

Как бы вы вернули смещение «интересного бита найдено»? – Floris

+0

@Floris - Не могли бы вы использовать атрибуты начала или диапазона объектов совпадения? – wwii

+0

@wwii - вы можете быть правы; Я думал, что ответ заслуживает того, чтобы его расширили с помощью этой информации, поскольку я не знаю, что ответ, но это важно ... – Floris

Смежные вопросы