Выполнение нескольких последовательных замен регулярных выражений в Python.Неэффективное? - PullRequest
4 голосов
/ 13 марта 2012

Прежде всего - мой код работает. Это просто медленно, и мне интересно, если я что-то упустил, что сделает его более эффективным. Я анализирую PDF-файлы с помощью python (и да, я знаю, что этого следует избегать, если это вообще возможно).

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

Я довольно плохо знаком с Python и регулярными выражениями, поэтому вполне возможно, что это можно сделать лучше.

Спасибо за чтение.

    regexPagePattern = r"(Wk)\d{1,2}.\d{2}(\d\.\d{1,2})"
    regexCleanPattern = r"(\(continued\))?((II)\d\.\d{1,2}|\d\.\d{1,2}(II)|\d\.\d{1,2})"
    regexStartPattern = r".*(II)(\s)?(INDEX OF CHARTS AFFECTED)"
    regexEndPattern = r"(II.)\d{1,5}\((P|T)\).*"
    contentRaw = re.sub(regexStartPattern,"",contentRaw)
    contentRaw = re.sub(regexEndPattern,"",contentRaw)
    contentRaw = re.sub(regexPagePattern,"",contentRaw)
    contentRaw = re.sub(regexCleanPattern,"",contentRaw)

Ответы [ 2 ]

4 голосов
/ 13 марта 2012

Я не уверен, что вы делаете это внутри цикла.Если нет, то следующее не применяется.

Если вы используете шаблон несколько раз, вы должны скомпилировать его, используя re.compile( ... ).Таким образом, шаблон компилируется только один раз.Увеличение скорости должно быть огромным .Минимальный пример:

>>> a="a b c d e f"
>>> re.sub(' ', '-', a)
'a-b-c-d-e-f'
>>> p=re.compile(' ')
>>> re.sub(p, '-', a)
'a-b-c-d-e-f'

Другая идея : используйте re.split (...) вместо re.sub и работайте с массивом с полученными фрагментамиваших данных.Я не совсем уверен, как это реализовано, но я думаю, что re.sub создает фрагменты текста и объединяет их в одну строку, что дорого.После последнего шага вы можете присоединиться к массиву, используя " ".join(fragments).Очевидно, что этот метод не будет работать, если ваши шаблоны где-то перекрываются.

Было бы интересно получить информацию о времени вашей программы до и после ваших изменений.

0 голосов
/ 13 марта 2012

Regex всегда последний выбор при попытке декодировать строки.Поэтому, если вы видите другую возможность решить вашу проблему, используйте это.

Тем не менее, вы можете использовать re.compile для предварительной компиляции шаблонов регулярных выражений:

regexPagePattern = re.compile(r"(Wk)\d{1,2}.\d{2}(\d\.\d{1,2})")
regexPagePattern.sub("",contentRaw)

Это должно ускорить процесснемного (довольно мило;))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...