Krz*_*ski 1 python regex url tornado url-routing
是否有可能构造一个正则表达式来捕获所有出现的由字符序列分隔的文本?换句话说,我正在寻找一种等效的标准.split()方法。
我不能使用split(),因为正则表达式用于指定Tornado Web应用程序的URL路由。例如:
handlers = [
(r'/posts/([0-9a-zA-Z_\-]+)', PostsHandler),
]
Run Code Online (Sandbox Code Playgroud)
当为在Tornado,Django或任何其他实现Routes模式的Web框架上构建的Web应用程序指定URL路由时,这样的正则表达式会派上用场。特别是将未知长度的URL路径解析为参数列表。
到目前为止,我设法提出了以下正则表达式:
/^\/posts(?:\/([a-zA-Z0-9_\-]+))+/
Run Code Online (Sandbox Code Playgroud)
不幸的是,当表达式匹配时/posts/show/some-slug/15,它仅返回最后一个匹配组(15),而不是['show', 'some-slug', '15']。
我想要实现的是:
/posts/edit/15/ => ['edit', '15']/posts/edit/15 => ['edit', '15']/posts/2010/15/11 => ['2010', '15', '11']在Python中无法匹配无数的捕获。每个捕获组只能捕获一个匹配项,根据Python的定义,它捕获最后一个匹配项。具体来说,请参见MatchObject.group上的文档:
http://docs.python.org/library/re.html#re.MatchObject.group
具体来说,以下文字说明了捕获组的局限性:
如果在多次匹配的模式的一部分中包含一个组,则返回最后一个匹配项。
因此,捕获多个匹配项的唯一方法是对捕获组总数进行上限。因此,类似以下内容(未经测试)的内容最多可以匹配五个捕获:
/^\/posts\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-])+)?)?)?)?
Run Code Online (Sandbox Code Playgroud)
您可以按照先前的模板动态地为正则表达式构造字符串,但是无论哪种方式,它都将非常可怕。
| 归档时间: |
|
| 查看次数: |
1673 次 |
| 最近记录: |