1

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

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

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

当为构建在 Tornado、Django 或任何其他实现路由模式的 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']
4

4 回答 4

5

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

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

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

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

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

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

您可能会按照前一个模板动态地构造正则表达式的字符串,但无论哪种方式,它都会非常可怕。

于 2012-04-02T04:44:50.910 回答
1

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

于 2011-03-07T22:37:29.590 回答
1

要捕获与正则表达式匹配的所有事件,请使用

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

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

re.split()

很有趣的功能

于 2011-03-08T00:43:57.323 回答
0

我不知道 Python 正则表达式,但你想要的是一个全局匹配。如果您将 a 添加g到您的正则表达式的末尾,它应该可以使用我熟悉的语言来解决问题。

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

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

于 2011-03-07T22:41:47.230 回答