我已经看到一些网址正则表达式以一个Tornado应用程序中的$结尾递给我的团队......也许我不是网络文化最多的人,这对其他人来说很明显,但我看不到它匹配整个字符串(不在内部搜索)时明确指出行尾的区别。
有什么东西我缺少或者只是多余的吗?
编辑以更清楚我的意思:
handlers = [
tornado.web.URLSpec(r'/About/$', ShowSettingsHandler),
...
]
应该完全相同:
handlers = [
tornado.web.URLSpec(r'/About/', ShowSettingsHandler),
...
]
当处理程序调度程序查找完全匹配时,而不是子字符串。
答案 0 :(得分:4)
不同之处在于$
符号确保模式即使完全匹配,也不是另一个模式的子串。请参阅这两个正则表达式以匹配网址模式。
没有$符号: http://regexr.com?327d5
以下是djangobook的一些摘录,也可能与龙卷风有关:
^hello/$
模式包括插入符号(^)和美元符号($)。这些是 具有特殊含义的正则表达式字符:插入符号 表示“要求模式匹配字符串的开头”,和 美元符号表示“要求模式匹配结束 字符串“
这个概念最好用例子来解释。如果我们改为使用了 pattern'^ hello /'(最后没有美元符号),然后是任何URL 以/ hello /开头匹配,例如/ hello / foo和/ hello / bar, 不只是/你好/。同样,如果我们放弃了最初的插入符号 字符(即'hello / $'),Django将匹配以任何结尾的URL 你好/,比如/ foo / bar / hello /。如果我们只使用hello /,没有 插入符号或美元符号,然后包含hello /的任何URL匹配, 例如/ foo / hello / bar。因此,我们使用插入符号和美元符号 确保只有URL / hello /匹配 - 仅此而已。
答案 1 :(得分:3)
龙卷风中不需要尾随$
。我把它们放在习惯之外,因为我觉得它更清楚,但是r"^/hello"
只会匹配/你好。
我们可以通过查看URLSpec source:
来看到这一点if not pattern.endswith('$'):
pattern += '$'