Регулярные выражения — особенности
Как работает регулярное выражение (regexp): сначала оно пытается найти максимально возможное совпадение для текущей группы символов, затем посимвольно откатываясь к началу совпавшей подстроки (backtracking), в попытке найти совпадение для последующей группы символов регулярного выражения. Это верно для «жадных» (greedy) типов групп (по умолчанию, к примеру [\w]*). Если группа «ленивая» (lazy), то откатывание производится от начала совпавшей подстроки вперёд. Пример ленивой группы — [\w]*?.
Ниже перечислены некоторые вещи о регулярных выражениях, которые полезно знать.
-
Capturing Groups
1(группа)повтор группы:
1\1 -
Named Capturing Groups
1(?P<имя_группы>группа)
повтор группы:
1(?P=имя_группы) -
Non-Capturing Groups.
1(?:группа)
-
Atomic Grouping (атомарные группы).
Атомарная группа не откатывается, поэтому работает значительно быстрее, но совсем не такая гибкая.1(?>группа)Пример:
a(?:bc|b)c совпадёт и с abc, и с abcc,
а a(?>bc|b)c совпадёт с abcc, но не с abc. С последней строкой совпадения не будет, т.к. произойдёт совпадение (?>bc|b) с последними двумя буквами строки, после чего будет сделана попытка сравнить символ c с пустой строкой, которая потерпит неудачу. Неатомарная группа сделала бы откатывание с попыткой поиска совпадения альтернативы (b), но атомарная группа не может откатиться после того, как было найдено любое совпадение с ней. -
Lookahead:
positive lookahead — утверждение, что после группы должна находиться определённая группа.1(?=группа)negative lookahead — утверждение, что после группы не должно быть определённой группы.
1(?!группа)При этом длина lookahead и lookbehind равна нулю, т.е. дальнейший поиск совпадений начинается с группы, предшествующей lookahead-у. Lookahead и lookbehind являются атомарными группами (см. выше).
Пример:
b(?=a) совпадёт с b в back, но не совпадёт с b в bed или в debt. -
Lookbehind:
positive lookbehind — утверждение, что перед группой должна находиться определённая группа.1(?<=группа)negative lookbehind — утверждение, что перед группой не должно быть определённой группы.
1(?<!группа)
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.