Python (.*js$)和.*(js)之间有什么区别$

Python (.*js$)和.*(js)之间有什么区别$,python,regex,tornado,Python,Regex,Tornado,我正在使用tornado构建一个服务器。它基于python,我需要执行以下操作: application.add_handlers(r"^(www).*",[ (r"/(.*js$)", tornado.web.StaticFileHandler, {'path': 'static/'}), (r"/(.*xml$)", tornado.web.StaticFileHandler, {'path': 'static/'}), (r"/(.*css$)", tornado.

我正在使用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文件

它确实工作得很好,但我不太理解正则表达式部分。
正如您所看到的,是一个正则表达式,用于匹配http请求。如果http请求正在查找js文件,第一个正则表达式将被匹配,但我不知道如何匹配。

据我所知,如果我想匹配一个js文件,我需要这样做一个正则表达式:
r/.*(js)$”
,这意味着文件以
js
结尾。我试过了,但没用。

那么为什么
(.*js$)
可以工作呢?这不是意味着文件的结尾是一个字母
s
,而不是
js
*(js)$
(.*js$)
之间有什么区别?此外,
^.*abc$
*abc$
^.*abc
*(abc)$
^.*(abc)
,它们之间的区别是什么?


我一定是误解了或者不理解关于正则表达式中
()
^
$
的一些规则。

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

您的替代模式只返回“js”,这对于查找URL的静态资源没有多大用处。原始文件返回完整路径(减去前导斜杠)

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

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

我不知道tornado是什么,但我假设它与捕获的地址有关,所以如果你不了解全部内容,即使正则表达式匹配,它也不会工作。对于其他问题,请尝试查找有关基本正则表达式含义的更多信息(.*js$)为什么起作用`

上面的正则表达式匹配以
js
结尾的任何内容,而不仅仅是扩展名为
js

查看此正则表达式并进行解释

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

(.*\.js$)

你问的其实是关于正则表达式的教程。它们已经存在于网上了:,很好。这似乎是假定工作版本的一个问题。@Yves:你从哪里得到路由表的?过度渴望的匹配应该在那里解决。非常感谢。Tornado是构建web服务器的新框架。它与tomcat一样,但非常轻巧且易于学习。请注意,
*
是否在括号内很重要,但
$
是否在括号内并不重要(在本例中)
$
在正则表达式中是“零宽度匹配”,因此它对捕获组没有任何贡献。在更复杂的情况下,
$
的位置可能会有所不同(例如,如果使用了
|
)。