2015-12-02 5 views
4

Цель состоит в том, чтобы преобразовать эти регулярные выражения в C++boost до Pythonre регулярных выражений:Преобразование C++ Повышение регулярных выражений в Python повторно регулярных выражений

typedef boost::u32regex tRegex; 

    tRegex emptyre = boost::make_u32regex("^$"); 
    tRegex commentre = boost::make_u32regex("^;.*$"); 
    tRegex versionre = boost::make_u32regex("^@\\$Date: (.*) \\$$"); 
    tRegex includere = boost::make_u32regex("^<(\\S+)$"); 
    tRegex rungroupre = boost::make_u32regex("^>(\\d+)$"); 
    tRegex readreppre = boost::make_u32regex("^>(\\S+)$"); 
    tRegex tokre = boost::make_u32regex("^:(.*)$"); 
    tRegex groupstartre = boost::make_u32regex("^#(\\d+)$"); 
    tRegex groupendre = boost::make_u32regex("^#$"); 
    tRegex rulere = boost::make_u32regex("^([!-+^])([^\\t]+)\\t+([^\\t]*)$"); 

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

  • как преобразовать C++ увеличить regexest в Python и
  • В чем разница между регулярными выражениями и re-выражениями python?

ли C++ boost::u32regex же, как re регулярных выражений в Python? Если нет, в чем разница? (Ссылки на документы были бы оценены =)) Например:

  • в импульс, есть boost::u32regex_match, что так же, как re.match?
  • в импульс, есть boost::u32regex_search, как это отличается от re.search
  • есть также boost::format_perl и boost::match_default и boost::smatch, каковы их эквивалентность в pythonre?
+3

Обратите внимание, что '[! - +]' соответствует '!', '' ',' # ',' $ ','% ',' & ',' '', '(', ')', ' * 'и' + '(' rulere' regex). Все регулярные выражения здесь будут работать одинаково на Python.Если у вас более сложные шаблоны, поделитесь им. 're.match' - это не то же самое, что' regex_match' как ' re.match' ищет совпадение в начале строки, а 'regex_match' требует полного совпадения строк.' regex_search' ведет себя как 'regex_search'. Вы можете добавить привязку' '' к шаблонам, которые используются с 'regex_match' и передать их в' re.match'. Не существует флагов 'boost :: format_perl' и' boost :: match_default'. Smatch является 'finditer'. –

+0

На самом деле это код' .cpp': https: //gist.github.com/alvations/99354d0fbe294c14cf7f, который используется для чтения серии файлов '.rpp': https://www.dropbox.com/s/ppgglwvwz16hlt1/erg.zip?dl=0 из этого программного обеспечения http : //moin.delph-in.net/ReppTop. Мы пытаемся перенести этот питон. – alvas

+1

Мое предложение состоит в том, что не пытайтесь сделать эту работу в Python 're'. Вместо этого используйте пакет 'regex'. В сущности, я вижу, что ввод интерпретируется как регулярное выражение. Пользовательское регулярное выражение может использовать дополнительные функции в Boost, которые могут быть недоступны в Python re. Кроме того, если вы имеете дело с Unicode, вы должны использовать Python 3.3+. Что касается остальной части вопроса, он слишком широк. – nhahtdh

ответ

2

Как преобразовать C++ увеличить regexest в Python

В случае простого регулярного выражения, как \w+\s+\d+ или >.*$ вам не придется изменить шаблон. В случае более сложных шаблонов с конструкциями, упомянутыми ниже, вам, скорее всего, придется переписать регулярное выражение. Как и при любом преобразовании из одного вкуса/языка в другой, общий ответ: DO NOT. Тем не менее, Python и Boost имеют некоторые сходства, особенно когда речь идет о простых шаблонах (если Boost использует PCRE-подобный шаблон), содержащий точку (a.*b), обычный ([\w-]*) и отрицательный ([^>]*) символьный класс, обычные кванторы, такие как +/*/?, и так далее.

чем разница между наддува и регулярных выражений питона re регулярных выражений?

Python re module не так богат, как Boost regexps (достаточно, чтобы отметить такие конструкции, как \h, \G, \K, \R, \X, \Q...\E, branch reset, recursion, possessive quantifiers, POSIX character classes and character properties, extended replacement pattern), а также другие особенности, которые наддува. (?imsx-imsx:pattern) ограничивается всем выражением в Python, а не частью его, поэтому вы должны знать, что (?i) в вашем &amp;|&#((?i)x26);|&#38; будет обрабатываться так, как если бы оно было в начале шаблона (однако оно не оказывает никакого влияния на это выражение).

Также, как и в Boost, вам не нужно скрывать [ внутри класса символов и { вне класса персонажа.

Обратные ссылки, такие как \1, такие же, как в Python.

Поскольку вы не используете группы захвата в чередовании в ваших шаблонах (например, re.sub(r'\d(\w)|(go\w*)', '\2', 'goon')), не должно быть никаких проблем (в таких случаях Python не заполняет группу, не участвующую в любом значении, и возвращает пустой результат).

Обратите внимание на разницу в определении названной группы: (?<NAME>expression)/(?'NAME'expression) в Boost и (?P<NAME>expression) в Python.

Я вижу, что ваши регулярные выражения в основном попадают под категорию «простых». Самый сложный шаблон - tempered greedy token (например, ⌊-((?:(?!-⌋).)*)-⌋). Чтобы их оптимизировать, вы можете использовать технику unroll the loop, но это может быть необязательно в зависимости от размера текстов, которые вы обрабатываете с помощью выражений.

Самая неприятная часть, поскольку я вижу, что вы используете литералы Юникода в большой степени. В Python 2.x все строки представляют собой массивы байтов, и вам всегда нужно убедиться, что вы передаете объект unicode в регулярные выражения Unicode (см. Python 2.x’s Unicode Support). В Python 3 все строки имеют UTF8 по умолчанию, и вы даже можете использовать буквенные символы UTF8 в исходном коде без каких-либо дополнительных действий (см. Python’s Unicode Support). Таким образом, Python 3.3+ (с поддержкой строковых литералов) является хорошим кандидатом.

Теперь, как и для остальных вопросов:

в импульс, есть boost::u32regex_match, что так же, как re.match?

The re.match не то же самое, как в качестве алгоритма regex_match re.match ищет матч в начале строки и regex_match требует полную строку матч. Однако в Python 3 вы можете использовать re.fullmatch(pattern, string, flags=0), что эквивалентно Boost regex_match.

в импульс, есть boost::u32regex_search, как это отличается от re.search

Whenver вам нужно найти матч в любом месте внутри строки, вы должны использовать re.search (см match() versus search()). Таким образом, этот метод обеспечивает аналоговую функциональность, как regex_search в Boost.

есть также boost::format_perl и boost::match_default и boost::smatch, каковы их эквивалентность в питона re?

Python не поддерживает Perl-подобные выражения в степени наддува, Python re модуль просто «обрезается» движок регулярных выражений Perl, который не имеет много хороших особенностей я упоминал ранее. Таким образом, никаких флагов, таких как default или perl, нет. Что касается smatch, вы можете использовать re.finditer, чтобы получить все match objects. A re.findall возвращает все совпадения (или подматрицы, только если группы захвата указаны) в виде списка строк/списков кортежей. См. re.findall/re.finditer difference.

И в заключении необходимо прочитать статью Python’s re Module.

+0

Спасибо за всесторонний ответ !!! Я все еще перевариваю информацию после прочтения =) – alvas

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