我正在使用龙卷风来构建服务器。它基于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)
之间的差异是什么?
我必须误解或无法理解有关正则表达式中()
,^
和$
的一些规则。
答案 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$)