2012-03-05 2 views
4

С в Perl documentation:Есть ли эквивалент Python для «изучения» Perl?

study занимает дополнительное время для изучения скаляра ($ _, если не указаны) в ожидании делать много соответствия шаблона на строке перед его следующей модификацией. Это может или не может сохранить времени, в зависимости от характера и количества шаблонов, которые вы ищете, и распределения частот символов в строке для поиска;

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

+1

Python позволяет скомпилировать объект регулярного выражения с помощью 're.compile (...)', но он охватывает сторону regexp. Я ничего не слышал в Python, который изучал бы строку, которую нужно искать. – Frg

+0

Это по существу тот же вопрос, что и [Preprocess string для эффективного поиска] (http://stackoverflow.com/q/9370740/1183387). К сожалению! – bonsaiviking

+1

Вы спрашиваете, есть ли у python функция, которая фактически замедляет ваши совпадения и не обрабатывает многое за пределами ASCII? (Я думаю, что они делают 'исследование' no-op в 5.16.) – ikegami

ответ

6

Насколько я знаю, в Python нет ничего подобного. Но, по словам the perldoc:

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

Это звучит не очень изощренно, и вы могли бы, вероятно, взломать что-то эквивалентное себе.

esmre является своего рода смутно похожим. И as @Frg noted, вы захотите использовать re.compile, если вы повторно используете одно регулярное выражение (чтобы избежать повторного разбора регулярного выражения снова и снова).

Или вы могли бы использовать suffix trees (здесь one implementation или вот C extension with unicode support) или suffix arrays (implementation).

+0

Спасибо за интересное чтение. Ваша ссылка должна быть [esmre] (https://code.google.com/p/esmre/), но не emsre. На данный момент я уверен, что мне не нужна функция «учебы», но ваш ответ был очень полезным. Я уже составлял свои регулярные выражения. – bonsaiviking

8

Исследование Perl на самом деле не имеет особого значения. Скомпилированное регулярное выражение получило целое, намного более умное, чем было, когда было создано study.

Например, он компилирует альтернативы в структуру trie с предсказанием Aho-Corasick.

Запустить с perl -Mre=debug, чтобы увидеть виды умения, применяемые компилятором и механизмом выполнения регулярных выражений.

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