Есть ли реализация регулярных выражений в Python/PHP/JavaScript, которая поддерживает зависание переменной длины?
/(?<!foo.*)bar/
Как я могу написать регулярное выражение, имеющее то же значение, но не использующее lookbehind-assertion?
Есть ли вероятность, что этот тип утверждения будет реализован когда-нибудь?
Вещи намного лучше, чем я думал.
Update:
(1) Есть реализация регулярных выражений, которые уже поддерживают lookbehind-assert с переменной длиной.
Модуль Python regex (не стандартный re
, но дополнительный модуль regex
) поддерживает такие утверждения (и имеет много других классные функции).
>>> import regex
>>> m = regex.search('(?<!foo.*)bar', 'f00bar')
>>> print m.group()
bar
>>> m = regex.search('(?<!foo.*)bar', 'foobar')
>>> print m
None
Для меня было большим сюрпризом, что в регулярных выражениях есть что-то, что Perl не может сделать, и Python может. Возможно, для Perl существует также "расширенное регулярное выражение"?
(Спасибо и +1 MRAB).
(2) В современных регулярных выражениях есть классная функция \K
.
Эти символы означают, что при выполнении подстановки (и с моей точки зрения наиболее интересным вариантом использования утверждений является подстановка), все символы, найденные до \K
, не должны быть изменены.
s/unchanged-part\Kchanged-part/new-part/x
Это почти похоже на утверждение, но не настолько гибкое, конечно.
Подробнее о \K
:
Насколько я понимаю, вы не можете использовать \K дважды в том же регулярном выражении. И вы не можете сказать, до какого момента вы хотите "убить" персонажей, которые вы нашли. Это всегда до начала строки.
(Спасибо и +1 к икегами).
Мои дополнительные вопросы:
- Можно ли сказать, какая точка должна быть конечной точкой эффекта
\K
? - Что касается расширенных реализаций регулярных выражений для Perl/Ruby/JavaScript/PHP? Что-то вроде
regex
для Python.