REGEX отличается от PHP до Python
Я нашел этот пост: Python Regex vs PHP Regex, но на самом деле я не получил, если синтаксис Python REGEX соответствует синтаксису PHP REGEX.
Я начал конвертировать некоторые из моих старых PHP-кода в python (из-за g appengine и т.д.), и теперь я хотел бы знать, является ли регулярное выражение на 100% конвертируемым, простым копированием и вставкой.
С уважением,
Ответы
Ответ 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 выражения здесь и выяснить некоторые более конкретные вещи.
Хороший вопрос, но трудно дать полный ответ, поскольку есть много переменных.