正则表达式除了某些匹配之外的一切

时间:2013-03-29 11:25:14

标签: python 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"

2 个答案:

答案 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'}