谷歌应用引擎正则表达式

1 投票
3 回答
843 浏览
提问于 2025-04-16 06:11

我正在做一个Google App Engine的项目,遇到了一些困扰。我的目标是让下面的代码(如果正则表达式正常的话)把所有不包含“test”这个词的请求重定向到MainPage类,而包含“test”的请求则重定向到TestPage类。

application = webapp.WSGIApplication(
                                     [
                                        ('[^(test)]*', MainPage),
                                        ('.+', TestPage)
                                     ],
                                     debug=True)

但是,我发现正则表达式的解释方式有问题:

('[^tes]*', MainPage)

这意味着任何包含字母t、e或s的内容都不会被导向MainPage(在这种情况下,它会导向TestPage)。显然,解决办法是重新写TestPage的正则表达式,但我不想这样做。我希望这个代码本身就能正常工作,而不需要重写。

我是不是漏掉了什么库?还是说这是配置的问题?在调用函数或设置属性之前,我对运行run_wsgi_app没有太多问题,但现在看起来有点不一致。


更新

结果发现问题出在两个方面。首先是我在语法上犯了错误(我错了)。其次,我用来确认正则表达式的工具说这个表达式不会匹配“test”,但会匹配“t est”。

3 个回答

3

在正则表达式中,方括号表示一组字符,而括号在里面没有特别的意思。所以 [^(test)] 的意思是匹配除了 't'、'e'、's'、'(' 和 ')' 以外的任何字符。

3

为什么不直接反过来做呢?与其检查[不是'test'],不如直接检查'test'会简单一些。把匹配到'test'的路由指向TestPage,其他的则指向MainPage。

这两者的不同在于(不工作):

'[^(test)]*'

'test'

除非我完全搞错了。

7

其实,这里的意思是,它被理解为和字符的任何重新排列是一样的,除了方括号里的开头符号,比如 [^est()]。标准的正则表达式语法没有简单的方法来指定与特定正则表达式匹配的语言的补集。

在这种情况下,你不需要担心这个问题。按照Erik Noren的建议,改变匹配表达式的顺序,像这样:

application = webapp.WSGIApplication(
                                     [
                                        ('test', TestPage)
                                        ('.+', MainPage),
                                     ],
                                     debug=True)

这样做可以简单地达到相同的效果。

撰写回答