2017-05-19 67 views
1

我使用龙卷风来构建服务器。它是基于Python的,我需要如下操作:

application.add_handlers(r"^(www).*",[ 
    (r"/(.*js$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*xml$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*css$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*jpg$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*png$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*ico$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 
    (r"/(.*html$)", tornado.web.StaticFileHandler, {'path': 'static/'}), 

    (r"/$", IndexHandler), 
]) 

上面的代码是要告诉一个http请求,它请求资源的位置。所以在这里我告诉一个http请求,它可以在路径./static/下获得js,xml,css,jpg,png,ico和html文件。

它工作得很好,但我不太了解正则表达式的一部分。
正如你看到的r"/(.*js$)"是一个正则表达式,它匹配一个http请求。如果http请求正在寻找一个js文件,第一个正则表达式将匹配,但我不知道如何。根据我的理解,如果我想匹配一个js文件,我需要这样做一个正则表达式:r"/.*(js)$",这意味着以js结尾的文件。我试过了,但它不起作用。

那么为什么(.*js$)工作?这是不是表示以一个字母s而不是js结尾的文件? .*(js)$(.*js$)有什么区别?而且,^.*abc$,.*abc$,^.*abc,.*(abc)$,^.*(abc)之间的区别是什么?

我必须误解或不能理解关于(),^$的一些规则。

+2

什么你问的是真正的正则表达式的教程。它们已经在线存在:[一般](http://www.regular-expressions.info/tutorial.html),[关于锚点](http://www.regular-expressions.info/anchors.html),[关于组和捕获](http://www.regular-expressions.info/brackets.html) – viraptor

回答

0

“为什么(。* JS $)更多信息工作?`

上述正则表达式匹配任何以js结束,不仅扩展js文件
查看此正则表达式demo的解释。

要匹配具有js扩展你需要一个文件下面的正则表达式

(.*\.js$) 
+0

好的。这似乎与所谓的工作版本也是一个问题。 – Thilo

+0

@ Yves:你从哪里得到那个路由表?过度渴望的匹配应该在那里修复。 – Thilo

0

()之间的部分是作为捕获组返回的部分。

您的替代模式仅返回“js”,这对于找到URL的静态资源并不那么有用。原始返回完整路径(减去前导斜杠)。

所以是的,你的模式也与URL相匹配,但是它不会返回解析为任何静态资源的路径(尝试创建一个名为static/js的文件,然后看看你是否得到了这个文件)。

1

圆括号()表示捕获组。
例如如果您的地址是http://www.example.com/something.js
r"/(.*js$)"将匹配和捕捉www.example.com/something.js
r"/.*(js)$"也将匹配,但是只捕获JS

我不知道龙卷风是什么,但我假设它对捕获的地址做了些什么,所以如果你没有得到所有的东西,即使正则表达式匹配,它也不会工作。为了您的其他问题,尝试寻找here对基本的正则表达式的含义

+0

非常感谢。龙卷风是构建Web服务器的新框架。它就像tomcat一样,但非常轻便易学。 – Yves

+0

请注意,'。*'是否在括号内是很重要的,但是在这个例子中,'$'是否是无关紧要的。 '$'是正则表达式中的“零宽度匹配”,所以它对捕获组没有任何贡献。在更复杂的情况下,它可能会影响'$'的位置(例如,如果使用'|')。 –

相关问题