intnzy
@intnzy

Почему «срабатывает» выражение?

Программа на Python.

line='/link/abcd'
pattern='/link/abcd(\/.*)?'
m=re.match(pattern,line)


Подскажите, почему срабатывает match при line = '/link/abcdefffsd' например?
Подразумевалось, что должно срабатывать только на линк вида
/link/abcd
/link/abcd/blablabla
т.е. либо сам линк, либо линк заканчивается на / и далее любые символы после слеша.
  • Вопрос задан
  • 3213 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст

У вас лишний обратный слеш а авражении "\" и строка не сырая. Короче, правильно леоать так:
re.match(r'/link/abcd(/.*)?$','/link/abcd/')
Хвостовой слеш не обязателен, но если он есть, после него допускаются любые символы в любом количестве, в том числе нулевом.

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
truekenny
@truekenny
А если в конце паттерна поставить "$"? (без кавычек)
Ответ написан
@Refandler
import re

line='/link/abcd/fdfs'
pattern='/link/abcd(\/.*)$'
m=re.match(pattern,line)
if (m):
	print "Okay"
else:
	print "WTF????"


Так сделай
Ответ написан
@Refandler
import re

line='/link/abcd'
pattern='^/link/(abcd)/(.*)$'
m=re.match(pattern,line)
if (m):
	print "Okay"
else:
	print "WTF????"
Ответ написан
Срабатывает из-за того, что? в конце (т.е. часть в скобках — не обязательна). То, что вы хотите, делается регексом
/link/abcd(/.*)?$
Ответ написан
Комментировать
KorP
@KorP
Кратко о себе
pattern='/link/abcd(\/.*)?$'
Ответ написан
Комментировать
afiskon
@afiskon
Выражению .* соответствует помимо прочего пустая строка. То, что вы хотите достичь, как я понял, — это (\/.+)? См также тынц.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы