Python重模块组匹配机制

2024-04-16 21:14:26 发布

您现在位置:Python中文网/ 问答频道 /正文

问题形成

背景

当我在python2.7 redoc阅读教程时,它介绍了组的行为:

The groups() method returns a tuple containing the strings for all the subgroups, from 1 up to however many there are.

问题

我很清楚这是如何单独运作的。但我能理解下面的例子:

>>> m = re.match("([abc])+","abc")
>>> m.groups()
('c',)

我的意思是,+不仅仅意味着一个或多个。如果是这样的话,正则表达式([abc])+=([abc])([abc])+(不是形式的BNF)不应该吗。因此,结果应该是:

('a','b','c')

请解释一下背后的机制,谢谢。你知道吗

附言

我想学习regex语言的解释器,我应该怎么开始呢?书籍或正则表达式版本,谢谢!你知道吗


Tags: thefor教程allmethodreturnsgroups背景
3条回答

基本上,regex术语中引用的groups是regex中定义的捕获组。你知道吗

例如,在'([abc])+'中,只有一个捕获群,即([abc]),而在'([abc])([xyz])+'中有两个群。你知道吗

因此在您的示例中,调用.groups()将始终返回长度为1的元组,因为这是regex中存在的组数。你知道吗

它没有返回您期望的结果的原因是因为您在组的外部使用了repeat操作符+。结果是causing the group to equal only the last match,因此只保留最后一个匹配(c)。另一方面,如果您使用了'([abc]+)'(注意,+is捕获组中),结果会是:

('abc',)

好吧,我想一张照片胜过1000个字:

Regular expression visualization

link to the demo

所发生的事情是,正如您在自动机的可视表示上所看到的,regexp在一个字符上分组一次或多次,直到它到达匹配的结尾。最后一个角色进入组。你知道吗

如果你想得到你所说的结果,你需要做如下的事情:

([abc])([abc])([abc])

Regular expression visualization

它将在每个位置匹配和分组一个字符。你知道吗

关于文档,我建议您阅读NFA的第一个理论和regexp。麻省理工学院关于这个主题的文档非常好:

一对分组括号形成一个组,即使它在一个量词中。如果一个组由于一个量词而匹配多次,则只保存该组的最后一个匹配。这个小组并不像有比赛的小组那么多。你知道吗

相关问题 更多 >