Perl Compatible Regular Expression (PCRE) в Python

Я должен разбирать некоторые строки на основе PCRE в Python, и я не знаю, как это сделать.

Строки, которые я хочу разборки, выглядят так:

match mysql m/^.\0\0\0\n(4\.[-.\w]+)\0...\0/sp/MySQL/ i/$1/ 

В этом примере мне нужно получить следующие элементы:

 "m/^.\0\0\0\n(4\.[-.\w]+)\0...\0/s" ; "p/MySQL/" ; "i/$1/" 

Единственное, что я нашел в отношении манипуляции с PCRE в Python, это этот модуль: http://pydoc.org/2.2.3/pcre.html (но это написано как .so ..)

Вы знаете, существует ли какой-нибудь модуль python для синтаксического анализа такого типа строк?

  • Удаление символов, отличных от ASCII, из строки с использованием python / django
  • Юникод, регулярные выражения и PyPy
  • Как объединить несколько регулярных выражений в одну строку?
  • Как обнаружить идентичную часть (-ы) внутри строки?
  • Проблема с регулярным выражением внешнего вида Python: недопустимое регулярное выражение: look-behind требует шаблона с фиксированной шириной
  • Как добавить конечную косую черту для приложения для категоризации Django MPTT?
  • Как сделать sed, как текст, заменить на python?
  • Можно ли создать шаблон регулярного выражения Python для соответствия и замены символов Unicode, отличных от ASCII?
  • 3 Solutions collect form web for “Perl Compatible Regular Expression (PCRE) в Python”

    Будьте особенно осторожны с не-ASCII в Python

    Есть некоторые очень тонкие проблемы с тем, как Python занимается или не справляется с не-ASCII в шаблонах и строках. Хуже того, эти различия существенно различаются не только по той версии Python, которую вы используете, но и по тому, есть ли у вас «широкая сборка».

    В общем, когда вы делаете Unicode, Python3 с широким построением работает лучше всего, а Python2 с узкой сборкой работает хуже, но все комбинации по-прежнему довольно далеки от того, как работают регулярные выражения Perl в отношении Unicode. Если вы ищете шаблоны ᴘᴄʀᴇ в Python, вам, возможно, придется искать немного дальше, чем его старый модуль re .

    EDIT : досадные «широкомасштабные» проблемы окончательно были исправлены раз и навсегда – если вы используете достаточно продвинутый выпуск Python. Вот выдержка из примечаний к выпуску v3.3 :

    функциональность

    Изменения, внесенные PEP 393 , следующие:

    • Python теперь всегда поддерживает полный диапазон кодов Unicode, включая не BMP (т.е. от U + 0000 до U + 10FFFF). Различие между узкими и широкими сборками больше не существует, и теперь Python ведет себя как широкая сборка, даже под Windows.
    • С гибелью узких сборок также были устранены проблемы, характерные для узких сборок, например:
      • len() теперь всегда возвращает 1 для символов без BMP, поэтому len('\U0010FFFF') == 1 ;
      • суррогатные пары не рекомбинируются в строковых литералах, поэтому '\uDBFF\uDFFF' != '\U0010FFFF' ;
      • индексирование или нарезка символов, отличных от BMP, возвращает ожидаемое значение, поэтому '\U0010FFFF'[0] теперь возвращает '\U0010FFFF' а не '\uDBFF' ;
      • все остальные функции в стандартной библиотеке теперь корректно обрабатывают не-BMP-коды.
    • Значение sys.maxunicode теперь всегда 1114111 (0x10FFFF в шестнадцатеричном формате). Функция PyUnicode_GetMax() прежнему возвращает 0xFFFF или 0x10FFFF для обратной совместимости и не должна использоваться с новым Unicode API (см. Вопрос 13054 ).
    • Флаг The ./configure --with-wide-unicode удален.

    Будущее Python Regexes

    В отличие от того, что в настоящее время доступно в стандартной библиотеке дистрибутива Python, модуль regex Мэтью Барнетта для Python 2 и Python 3 намного, намного лучше в самых разных вариантах, и, скорее всего, заменит его в конце концов. Его особая значимость для вашего вопроса заключается в том, что его библиотека regex намного больше ᴘᴄʀᴇ ( т. Е. Намного больше Perl-совместимых ) во всех отношениях, чем сейчас, что сделает перенос Perl-регулярных выражений на Python проще для вас. Потому что это перезапись (как в случае с царапинами не так, как в гамбургере :), она была написана с учетом не-ASCII, чего не было.

    Таким образом, библиотека regex гораздо ближе соответствует (текущим) рекомендациям UTS # 18: Unicode Regular Expressions в том, как она приближается к вещам. Он соответствует или превосходит требования UTS № 18 уровня 1 в большинстве, если не во всех отношениях, то, что вам обычно нужно использовать библиотеку регулярных выражений ICU или самому Perl для – или если вы особенно мужественны, новое обновление Java 7 для своих регулярных выражений, что также соответствует требованиям первого уровня от UTS # 18.

    Помимо удовлетворения тех требований уровня один, которые абсолютно необходимы для базовой поддержки Unicode, но которые не удовлетворяются текущей библиотекой Python, удивительная библиотека regex также соответствует требованиям уровня 2 для именных символов RL2.5 ( \N{...}) ), RL2.2 Extended Grapheme Clusters ( \X ) и новый RL2.7 на Full Properties из версии 14 UTS # 18 .

    Модуль regex Мэтью также выполняет разметку в Unicode, так что нечувствительные к регистру совпадения работают над Unicode, а это не так.

    EDIT : Следующая функция больше не верна, потому что regex теперь поддерживает полноэкранную разметку Unicode, например Perl и Ruby.

    Одно супер-крошечное различие заключается в том, что на данный момент шаблоны, не учитывающие регистр, используют полные строковые ориентированные фреймы, в то время как его модуль regex прежнему использует простые односимвольные фреймворки, но это то, что он изучает. На самом деле это очень сложная проблема, одна из которых помимо Perl, только Ruby даже пытается.

    В случае полного casefolding это означает, что (например) "ß" теперь корректно соответствует "SS" , "ss" , "ſſ" , "ſs" (и т. Д.), Когда выбрано совпадение по регистру. (Это, по общему признанию, более важно в греческом сценарии, чем в латинском.)

    См. Также слайды или исходный код документа из моего третьего сеанса OSCON2011, озаглавленного « Unicode Support Shootout: Good, the Bad и (в основном) Ugly » для общих проблем в поддержке Unicode в Javascripts, PHP, Go, Ruby, Python, Java , и Perl. Если вы не можете использовать регулярные выражения Perl или, возможно, библиотеку регулярных выражений ICU (которая не имеет именных захватов, увы!), regex Matthew для Python, вероятно, будет вашим лучшим выстрелом.


    Nᴏᴛᴀ Bᴇɴᴇ s.ᴠ.ᴘ. (= s'il vous plaît, et même s'il ne vous plaît pas 🙂 Следующее незапрошенное некоммерческое непроизнесение фактически не было написано автором библиотеки regex Python. 🙂

    regex функции regex

    Библиотека regex Python имеет роговую оболочку функций надстройки , некоторые из которых не найдены ни в одной другой регулярной системе. Это очень важно проверить независимо от того, используете ли вы его для своей ᴘᴄʀᴇ-ness или ее звездной поддержки Unicode.

    Некоторые из интересных особенностей этого модуля представляют интерес:

    • Переменная ширина lookbehind , функция, которая довольно редка в двигателях регулярных выражений и очень расстраивает, чтобы не иметь, когда вы действительно этого хотите. Это может быть наиболее часто запрашиваемая функция в регулярных выражениях.
    • Обратный поиск, поэтому вам не нужно сначала менять свою строку.
    • Параметры scme ismx типа, так что (?i:foo) только casefolds для foo, а не в целом, или (?-i:foo) чтобы отключить его только на foo. Так Perl работает (или может).
    • Нечеткое совпадение на основе расстояния редактирования (которое также проявляется у Уди Манбера и glimpse )
    • Неявные кратчайшие и самые длинные отсортированные списки имен с помощью интерполяции \L<list>
    • Метасимволы, которые специально соответствуют только началу или только концу слова, а не каждой из сторон ( \m , \M )
    • Поддержка всех разделителей строк Юникода (Java может это сделать, также как и Perl, хотя и несколько неудобно с \R на RL1.6 .
    • Операции с полным набором операций – объединение, пересечение, разность и симметричная разность – на символьных классах с символами в скобках по RL1.3 , что намного проще, чем получение на нем в Perl.
    • Позволяет повторять группы захвата, такие как (\w+\s+)+ где вы можете получить все отдельные совпадения первой группы, а не только ее последнее совпадение. (Я считаю, C♯ тоже может это сделать.)
    • Более прямой способ получить совпадение совпадений, чем скрытые группы захвата в образах.
    • Начальные и конечные позиции для всех групп для последующих операций нарезки / подстроки, подобно Perl's @+ и @- массивам.
    • Оператор сброса-сброса через (?|...|...|...|) чтобы сбросить нумерацию групп в каждой ветке так, как она работает в Perl.
    • Может быть настроен на то, чтобы ваш кофе ждал вас утром.
    • Поддержка более сложных границ слов из RL2.3 .
    • Предполагается, что строки Unicode по умолчанию и полностью поддерживают RL1.2a, так что \w , \b , \s и такие работают в Unicode.
    • Поддерживает \X для графем.
    • Поддерживает утверждение точки продолжения \G
    • Правильно работает для 64-битных построений (только для 32-разрядных индексов).
    • Поддерживает многопоточность.

    Хорошо, хватит шумихи. 🙂

    Еще один тонкий альтернативный двигатель регулярных выражений

    Одна из последних альтернатив, на которую стоит обратить внимание, если вы – разработчик регулярных выражений, – это привязка библиотеки Python к потрясающей библиотеке RE2 от Russ Cox. Он также поддерживает Unicode изначально, в том числе простой основанный на символах casefolding, и в отличие от него он, в частности, обеспечивает как общие категории Unicode, так и свойства символа Unicode Script, которые являются двумя ключевыми свойствами, которые наиболее часто необходимы для более простых видов обработки Unicode.

    Хотя RE2 пропускает несколько функций Unicode, таких как \N{...} поддержкой символов, найденных в ICU, Perl и Python, имеет чрезвычайно серьезные вычислительные преимущества, которые делают его двигателем регулярного выражения, когда вы беспокоитесь о голоде Основанные на отказах в обслуживании, с помощью регулярных выражений в веб-запросах и т. Д. Он управляет этим, запрещая обратные ссылки, которые заставляют регулярное выражение перестать быть обычным и рисковать сверхэкспоненциальными взрывами во времени и пространстве.

    Связывание библиотек для RE2 доступно не только для C / C ++ и Python, но также для Perl и, в особенности, для Go, где в скором времени будет заменена стандартная библиотека регулярных выражений.

    Вы ищете '(\w/[^/]+/\w*)' .

    Используется так,

     import re x = re.compile('(\w/[^/]+/\w*)') s = 'match mysql m/^.\0\0\0\n(4\.[-.\w]+)\0...\0/sp/MySQL/ i/$1/' y = x.findall(s) # y = ['m/^.\x00\x00\x00\n(4\\.[-.\\w]+)\x00...\x00/s', 'p/MySQL/', 'i/$1/'] 

    Нашел его, играя с тренером Regex тренера Эди Вайца, поэтому благодаря комментариям к вопросу, который заставил меня вспомнить его существование.

    Вы также можете проверить новые привязки Python от Arkadiusz Wahlig для PCRE: https://github.com/awahlig/python-pcre

    Python - лучший язык программирования в мире.