正则表达式,用于捕获由一系列字符分隔的所有文本

问题描述 投票:1回答:4

是否可以构造一个正则表达式来捕获由一系列字符分隔的所有文本?换句话说,我正在寻找相当于标准的.split()方法。

我不能使用split(),因为正则表达式用于指定Tornado Web应用程序的URL路由。例如:

handlers = [
    (r'/posts/([0-9a-zA-Z_\-]+)', PostsHandler),
]

在为Tornado,Django或任何其他实现Routes模式的Web框架构建的Web应用程序指定URL路由时,这样的正则表达式会派上用场。特别是,将未知长度的URL路径解析为参数列表。

到目前为止,我已经设法提出以下正则表达式:

/^\/posts(?:\/([a-zA-Z0-9_\-]+))+/

不幸的是,当表达式与/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 regex url url-routing tornado
4个回答
5
投票

没有办法在Python中匹配无限数量的捕获。每个捕获组只能捕获一个匹配,并且根据Python的定义,它捕获最后一个匹配。具体来说,请参阅MatchObject.group上的文档:

http://docs.python.org/library/re.html#re.MatchObject.group

具体而言,以下文本解释了捕获组的限制:

如果一个组包含在多次匹配的模式的一部分中,则返回最后一个匹配。

因此,捕获多个匹配的唯一方法是在捕获组的总数上设置上限。所以类似下面的内容(未经测试)最多可匹配五个捕获:

/^\/posts\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-])+)?)?)?)?

您可以在前一个模板之后动态构造正则表达式的字符串,但不管怎样,它都会非常可怕。


1
投票

你试过了吗:str.split('/')?这应该完全符合您的要求(如果我理解正确的话)。有什么理由说它必须是正则表达式吗?


1
投票

要捕获正则表达式匹配的所有出现,请使用

[ match.groups(....) for match in  pattern.finditer(the_string) ]

要根据模式进行拆分,请使用:

re.split()

非常有趣的功能


0
投票

我不知道Python正则表达式,但你想要的是全局匹配。如果你在你的正则表达式的末尾添加一个g它应该用我熟悉的语言来做。

/^\/posts(?:\/([a-zA-Z0-9_\-]+))+/g

此外,许多语言都有基于正则表达式的split函数。考虑一下,如果它可用,或者只是好的旧字符串拆分功能(这看起来更像是你想要的工具)。

© www.soinside.com 2019 - 2024. All rights reserved.