Как преобразовать 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)
в вашем &|&#((?i)x26);|&
будет обрабатываться так, как если бы оно было в начале шаблона (однако оно не оказывает никакого влияния на это выражение).
Также, как и в 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.
Обратите внимание, что '[! - +]' соответствует '!', '' ',' # ',' $ ','% ',' & ',' '', '(', ')', ' * 'и' + '(' 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'. –
На самом деле это код' .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
Мое предложение состоит в том, что не пытайтесь сделать эту работу в Python 're'. Вместо этого используйте пакет 'regex'. В сущности, я вижу, что ввод интерпретируется как регулярное выражение. Пользовательское регулярное выражение может использовать дополнительные функции в Boost, которые могут быть недоступны в Python re. Кроме того, если вы имеете дело с Unicode, вы должны использовать Python 3.3+. Что касается остальной части вопроса, он слишком широк. – nhahtdh