0

我正在尝试创建一个重定向正则表达式脚本,它将用户转发到另一个具有完整路径的域,除非路径与特定内容匹配。

IE

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"

4

2 回答 2

2

http://www.a.com/(?!special).* will match anything which starts with http://www.a.com/ but not http://www.a.com/special.

于 2013-03-29T11:28:47.910 回答
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'}
于 2013-03-29T11:27:29.923 回答