#регулярные_выражения
Простой вроде вопрос. Что означает регулярка "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
Комментариев нет:
Отправить комментарий