我正在尝试创建一个重定向正则表达式脚本,该脚本会将用户转发到路径完整的另一个域,除非路径与特定内容匹配。
即
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"
答案 0 :(得分:2)
http://www.a.com/(?!special).*
将匹配以http://www.a.com/
开头而非http://www.a.com/special
开头的所有内容。
答案 1 :(得分: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'}