Можно ли использовать re2 из Python? - PullRequest
22 голосов
/ 13 марта 2010

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

, поэтому я скачал код и сделал обычную sudo make install вещь.однако, это действие, казалось бы, сделало чуть больше, чем добавление /usr/local/include/re2/re2.h в мою систему.казалось, было какое-то расширение `` ` .a file in addition, but then what is it with this .a``?

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

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


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


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

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

Ответы [ 4 ]

15 голосов
/ 16 марта 2010

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

5 голосов
/ 13 марта 2010

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

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

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

3 голосов
/ 13 марта 2010

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

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

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

...