Страницы

Поиск по вопросам

понедельник, 12 ноября 2018 г.

Положение символа `^` в регулярном выражении

Простой вроде вопрос. Что означает регулярка "a^b" и можно ли ее найти в какой либо строке?
import re p = re.compile("a^b") p.search("ab") --> None p.search("a^b") --> None p.search("a
b") --> None
Если такое выражение действительно не соответствует никакой строке (действительно, как может символ a встретиться до начала проверяемой строки), то почему оно вообще компилируется?
Или, перефразируя, меняется ли смысл символа ^/$ в зависимости от его положения в регулярном выражении (не внутри квадратных скобок)? Если нет, то почему?
Вопрос безотносительно ЯП, python просто примера ради.


Ответ

^ означает "начало строки" вне зависимости от того, в какой части выражения встретилось. Так же как и $ - конец "строки". Но вот "начал" и "концов" в "строке" может быть несколько. Возьмем пример (на питоне, так на питоне):
import re p=re.compile("a.*^b",re.M+re.S) p.search("abc
abcd") --> None p.search("abc
bcd") --> <_sre.SRE_Match object; span=(0, 5), match='abc
b'>
При компиляции выражения указаны флаги: re.S заставляет соответствовать любым символам, включая перевод каретки. re.M заставляет рассматривать "строку", как "многострочную" - т.е. ^ начинает соответствовать не только началу данных, но и точке после любого перевода каретки. Вот мы и получили, что "a" встретился до начала строки.
Флаги можно задавать не только вторым параметром compile, но и внутри самой регулярки, конструкциями вроде (?sm). Думаю разработчикам регулярок влом проводить такой глубокий анализ (Есть флаги, нет, а когда они начали действовать), ради выдачи ошибок вроде "начала строки тут быть не может". Собственно по этому никто и не рискует рассматривать ^ и $ по разному, в зависимости от положения (кроме случаев с квадратными скобками, конечно).
Пример на regexp101.com

Комментариев нет:

Отправить комментарий