Можно ли использовать re2 из Python?

я только что обнаружил http://code.google.com/p/re2, многообещающую библиотеку который использует давно забытый способ (Thompson NFA) для реализации механизма регулярных выражений это может быть на несколько порядков быстрее, чем доступные механизмы awk, Perl или Python.

поэтому я скачал код и сделал обычную sudo make install вещь. однако это действие, по-видимому, сделало немногим больше, чем добавление /usr/local/include/re2/re2.h в мою систему. там вроде еще какой-то *.a файл был в придачу, но тогда что это с этим *.a расширением?

я хотел бы использовать re2 из Python (предпочтительно Python 3.1) и был рад видеть такие файлы, как make_unicode_groups.py в дистрибутиве (может быть, они просто использовались в процессе сборки?). однако они не были развернуты на моей машине.

как я могу использовать re2 из Python?


update два дружелюбных человека указали, что я могу попытаться собрать файлы DLL / *.so из исходников, а затем использовать библиотеку Python ctypes для доступа к ним. может ли кто-нибудь дать полезные советы, как это сделать? тут я почти не разбираюсь, особенно в первой части (создании файлов *.so).


обновление Я также отправил этот вопрос (ранее) разработчикам re2. группа, до сих пор без ответа (это небольшая группа), а сегодня в (несколько более многочисленную) comp.lang.py группа [—тема здесь—]. надежда состоит в том, что люди из разных уголков могут связаться друг с другом. я предполагаю, что опытный человек может сделать это за несколько часов в течение своего 20-процентного временного интервала, принадлежащего вашему свободному времени; это свяжет меня на несколько недель. есть ли инструмент для автоматического упрощения C++ до любого варианта C, который Python должен иметь возможность подключать? тогда, возможно, получение жизнеспособного результата можно свести к умной цепочке инструментов.

(напыщенно)почему это так сложно? думать, что в 2010 году мы все еще не можем позволить нашим многочисленным программным продуктам просто общаться друг с другом. это такое препятствие, что всякий раз, когда вы хотите обратиться к некоторому коду C из Python, вы всегда должны перебирать эти биты ссылок. это требует большой работы, но предоставляет только модуль расширения, специфичный для версии кода C и версии Python, поэтому он быстро устаревает. (/rant) можно ли запускать такие вещи в отдельных процессах (скажем, если бы у меня был исполняемый файл re2, который мог бы выдавать результаты для данных, поступающих, скажем, subprocess/Popen/communicate())? (это не должен быть чистый инструмент командной строки, который требует открытия процесс каждый раз, когда это необходимо, но один процесс, который работает непрерывно; возможно, существуют оболочки, которые как бы «демонизируют» такой код C).


person flow    schedule 13.03.2010    source источник
comment
+1 только за ссылку на статью Томпсона NFA   -  person President James K. Polk    schedule 13.03.2010
comment
Извлеките Makefile в проекте re2 и измените его, создав файл so. Затем добавьте свои собственные файлы в Makefile, чтобы обеспечить интерфейс между ctypes re2 и python. Вы должны использовать опцию -shared для создания файлов so. Просто погуглите Makefile и общие библиотеки.   -  person Tuomas Pelkonen    schedule 13.03.2010
comment
@GregS: google(Глушков НФА)   -  person John Machin    schedule 15.03.2010
comment
// По умолчанию шаблон и вводимый текст интерпретируются как UTF-8. // Опция RE2::Latin1 заставляет их интерпретироваться как Latin-1. Мне кажется устаревшее ПО :-(   -  person John Machin    schedule 15.03.2010
comment
Кстати, AWK использует метод NFA Томпсона; GAWK занимается этим уже пару десятилетий. Плохо с этим справились только современные языки.   -  person David Manheim    schedule 18.11.2014


Ответы (4)


Дэвид Рейсс собрал Python-оболочку для re2. Он не обладает всей функциональностью модуля Python re, но это только начало. Он доступен здесь: http://github.com/facebook/pyre2.

person Daniel Stutzbach    schedule 16.03.2010
comment
это тот ответ, на который я надеялся. спасибо тонна! - person flow; 17.03.2010
comment
Обратите внимание, что порт facebook очень простой и неполный. Лучше использовать один из форков, например github.com/axiak/pyre2. - person itsadok; 01.12.2010

Возможно да, легко нет. Глядя на re2.h, это библиотека C++, представленная как класс. Есть два способа использовать его из Python.

1.) Как говорит Туомас, скомпилируйте его как DLL и используйте ctypes. Однако, чтобы использовать его из python, вам нужно будет обернуть инициализацию объекта и методы во внешние функции в стиле c. Я делал это в прошлом с помощью ctypes, экстернируя функции, которые передают указатель на объект вокруг. Функция «init» возвращает пустой указатель на объект, который передается при каждом последующем вызове метода. Действительно очень грязно.

2.) Оберните его в настоящий модуль Python. Опять же, эти функции, открытые для python, должны быть внешними «C». Один из вариантов — использовать Boost.Python. , это облегчило бы эту работу.

person Mark    schedule 13.03.2010

SWIG обрабатывает C++ (в отличие от ctypes), поэтому использовать его может быть проще.

person Jouni K. Seppänen    schedule 13.03.2010

Вы можете попытаться встроить re2 в свою собственную DLL/so и использовать ctypes для вызова функций из этой DLL/so. Вам, вероятно, потребуется определить свои собственные точки входа в DLL/so.

person Tuomas Pelkonen    schedule 13.03.2010