是否可以构造一个正则表达式来捕获由一系列字符分隔的所有文本?换句话说,我正在寻找相当于标准的.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中匹配无限数量的捕获。每个捕获组只能捕获一个匹配,并且根据Python的定义,它捕获最后一个匹配。具体来说,请参阅MatchObject.group上的文档:
http://docs.python.org/library/re.html#re.MatchObject.group
具体而言,以下文本解释了捕获组的限制:
如果一个组包含在多次匹配的模式的一部分中,则返回最后一个匹配。
因此,捕获多个匹配的唯一方法是在捕获组的总数上设置上限。所以类似下面的内容(未经测试)最多可匹配五个捕获:
/^\/posts\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-]+)(?:\/([\w-])+)?)?)?)?
您可以在前一个模板之后动态构造正则表达式的字符串,但不管怎样,它都会非常可怕。
你试过了吗:str.split('/')
?这应该完全符合您的要求(如果我理解正确的话)。有什么理由说它必须是正则表达式吗?
要捕获正则表达式匹配的所有出现,请使用
[ match.groups(....) for match in pattern.finditer(the_string) ]
要根据模式进行拆分,请使用:
re.split()
非常有趣的功能
我不知道Python正则表达式,但你想要的是全局匹配。如果你在你的正则表达式的末尾添加一个g
它应该用我熟悉的语言来做。
/^\/posts(?:\/([a-zA-Z0-9_\-]+))+/g
此外,许多语言都有基于正则表达式的split
函数。考虑一下,如果它可用,或者只是好的旧字符串拆分功能(这看起来更像是你想要的工具)。