Подтвердить что ты не робот

REGEX отличается от PHP до Python

Я нашел этот пост: Python Regex vs PHP Regex, но на самом деле я не получил, если синтаксис Python REGEX соответствует синтаксису PHP REGEX.

Я начал конвертировать некоторые из моих старых PHP-кода в python (из-за g appengine и т.д.), и теперь я хотел бы знать, является ли регулярное выражение на 100% конвертируемым, простым копированием и вставкой.

С уважением,

4b9b3361

Ответ 1

Python использует синтаксис, подобный синтаксису Perl, и PHP использует синтаксис Perl Compatible Regular Expressions, поэтому он должен быть почти таким же. Читайте о возможном differences.

Единственное реальное отличие заключается в том, что в PHP выражение должно быть заключено в разделители.

Ответ 2

Они совместимы по большей части. Однако существуют некоторые различия, помимо различного синтаксиса (/regex/ в PHP vs. re.compile(r"regex") в Python):

  • PCRE поддерживает \Q...E, чтобы избежать метасимволов, Python этого не делает.
  • PCRE поддерживает управление символами \cA-\cZ, Python этого не делает.
  • Hyphen in [\d-z] или [a-\d] является литералом в PHP, а не в Python.
  • PCRE поддерживает \z (конец строки), Python этого не делает, только \z (конец строки перед необязательным окончательным переводом строки).
  • \b будет соответствовать границам слов только вокруг символов ASCII в PCRE, в Python он может соответствовать языковой зависимости, если параметр установлен.
  • Вы можете ссылаться на \1 и т.д. назад перед своими скобками в PCRE, вы не можете на Python.
  • Вы не можете отключить модификаторы режима в регулярном выражении ((?-s) и т.д.) в Python.
  • Вы не получаете атомную группировку (?>...) или притяжательные кванторы (.++) в Python, только в PCRE.
  • Lookbehind может быть конечной длиной в PCRE, должна быть фиксированной длиной в Python.
  • Нет шаблона \G (местоположение предыдущего совпадения).
  • Отсутствие условного соответствия в Python, только в PCRE: (?(?=regex)then|else).
  • Нет \x1234 для совпадений кодов Юникода в Python. Нет p{L} и другого соответствия свойств Юникода. В PHP это зависит от того, как он настроен/скомпилирован.
  • Нет [:alpha:] Классы символов POSIX в Python.

Собрано из regular-expressions.info, оставив некоторые из более эзотерических вещей. Но не так много.

Мораль: купите RegexBuddy и используйте его для перевода регулярных выражений для вас.

Ответ 3

Я считаю, что они, по крайней мере, в основном совместимы, т.е. > 2/3. На обеих сторонах могут быть некоторые языковые расширения, но ядро, безусловно, одно и то же. Это утверждение основано исключительно на моем (ограниченном) личном опыте, поэтому возьмите его с солью.

Обе реализации основаны на регулярных выражениях Perl, если я не ошибаюсь.

Ответ 4

Не уверен в правильном ответе, но я нашел хороший инструмент, который поможет в тестировании.

http://re.dabase.com/

Ура!

Ответ 5

После очень быстрых исследований я узнал, что основное различие:

PHP (имеет разделители)

/ REGEX / # "/" in front and at the end

Python (не имеет разделителей)

REGEX # no surrounding by any characters

Ответ 6

Механизмы регулярных выражений, которые встроены в разные языки, обычно имеют различия, даже если общий синтаксис одинаковый. PHP имеет несколько встроенных механизмов регулярного выражения (POSIX и PCRE), поэтому в зависимости от того, какие функции регулярного выражения вы используете, будет зависеть от того, насколько хорошо они будут конвертироваться.

Если вы в основном использовали функции preg_*, тогда они должны в основном конвертировать без проблем, однако я считаю, что реализация регулярных выражений на языке python не содержит дополнительных функций, которые включены в реализацию PHP.

Вы можете прочитать регулярные выражения PHP здесь и Python regular выражения здесь и выяснить некоторые более конкретные вещи.

Хороший вопрос, но трудно дать полный ответ, поскольку есть много переменных.