2013-03-29 4 views
0

Я пытаюсь создать сценарий regex перенаправления, который перенаправляет пользователя на другой домен с неповрежденным путем, за исключением случаев, когда путь соответствует определенному.Regex для всего, кроме определенных совпадений

т.е.

http://www.a.com/anything/foo/bar -> http:www.b.com/anything/foo/bar

, но если путь начинается с чего-то особенного, то не перенаправлять:

http://www.a.com/special/1/2/3 -> no redirect

Моя редирект приложение работает следующим образом: Я ставлю записи в строке (это отлично работает):

"^/(?P<path>[-\w]+)/(?P<foo>[-\w]+)/(?P<bar>[-\w]+)/$","%(path)s/%(bar)s/%(foo)s/" 
"^/(?P<path>.*)$","http://www.b.com/%(path)s" 

Так что-то вроде этого (не работает):

"^/(?P<path>!(special).*)$","http://www.b.com/%(path)s"

ответ

1

Вы ищете отрицательный предпросмотр:

"^/(?P<path>(?!special/).*)$","http://www.b.com/%(path)s" 

Синтаксис (?!...) означает:

(?!...)
Соответствует, если ... не соответствует следующему. Это отрицательное утверждение. Например, Isaac (?!Asimov) будет соответствовать 'Isaac ', только если за ним не последует 'Asimov'.

так что выражение соответствует, если путь начинается с /, но не с последующим special/.

Демо:

>>> import re 
>>> re.search(r"^/(?P<path>(?!special/).*)$", '/special/path') is None 
True 
>>> re.search(r"^/(?P<path>(?!special/).*)$", '/not-so-special/path').groupdict() 
{'path': 'not-so-special/path'} 
+0

Ah - Мне не хватало? перед ! - путают с начальным? для названного матча .. ура! –

2

http://www.a.com/(?!special).* будет соответствовать все, что начинается с http://www.a.com/, но не http://www.a.com/special.

Смежные вопросы