Страницы

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

суббота, 21 декабря 2019 г.

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

#регулярные_выражения


Простой вроде вопрос. Что означает регулярка "a^b" и можно ли ее найти в какой либо
строке?

import re
p = re.compile("a^b")
p.search("ab") --> None
p.search("a^b") --> None
p.search("a\nb") --> None


Если такое выражение действительно не соответствует никакой строке (действительно,
как может символ a встретиться до начала проверяемой строки), то почему оно вообще
компилируется?

Или, перефразируя, меняется ли смысл символа ^/$ в зависимости от его положения в
регулярном выражении (не внутри квадратных скобок)? Если нет, то почему?

Вопрос безотносительно ЯП, python просто примера ради.
    


Ответы

Ответ 1



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

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

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