(。* js $)和。*(js)$之间有什么区别?

时间:2017-05-19 03:30:05

标签: python regex tornado

我正在使用龙卷风来构建服务器。它基于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)之间的差异是什么?

我必须误解或无法理解有关正则表达式中()^$的一些规则。

3 个答案:

答案 0 :(得分:1)

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

我不知道龙卷风是什么,但我假设它对捕获的地址做了一些事情,所以如果你没有得到整个东西,即使正则表达式匹配它也不会工作。有关其他问题,请尝试查看here以获取有关基本正则表达式含义的更多信息

答案 1 :(得分:0)

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

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

所以,是的,您的模式也匹配URL,但它不返回解析为任何静态资源的路径(尝试创建一个名为static/js的文件并查看是否获得了该文件。)< / p>

答案 2 :(得分:0)

&#39;为什么(。* js $)有效?`

以上正则表达式匹配以js结尾的所有内容,而不仅仅是文件扩展名为js的文件 请参阅此正则表达式demo并附上说明。

要匹配具有js扩展名的文件,您需要以下正则表达式

(.*\.js$)