当前位置: 首页 > 面试题库 >

为什么重复捕获组返回这些字符串?

牛昱
2023-03-14
问题内容

有人可以解释为什么跟随返回“ cc”吗?

>>> re.match('(..)+', 'aabbcc').group(1)
'cc'

有人告诉我,因为它将每个匹配项都放入了group(1)中,所以最后一个匹配项是’cc’。真的吗?

那么下面如何解释?

>>> re.match('(..)+(...)', 'aabbcc').group(1)
'aa'

问题答案:

重复捕获组:组号保持不变

由定义的组(..)是组1。+量化器重复它。每当引擎能够重复该组(匹配两个字符)时,组1就会被覆盖。

  • 引擎开始匹配时,捕获aa到组1
  • 然后捕获bb到组1
  • 然后捕获cc到组1。

当您检查组1时,引擎将返回cc。所有其他捕获都将丢失。

(唯一的例外是.NET引擎,它也返回cc,但也可以让你的中间感谢CaptureCollection对象捕捉检查。这将包括aabbcc)。

使用(..)+(...),为什么第1组包含aa?回溯!

为了理解这一点,我们再次需要遵循正则表达式引擎的路径。

  • 再次,当引擎开始匹配时,它捕获aa到组1
  • 再次,它重复该(..)组并捕获bb到组1
  • 再次,它重复该(..)组并捕获cc到组1
  • 引擎现在尝试匹配(...)。失败:没有字符可消耗。
  • 发动机 回溯 无论是在字符串中的正则表达式。在+一次或多次,并且我们匹配的手段..三次,所以我们可以放弃一个,或者甚至是两个。在此阶段,引擎放弃了量化(..)+组的最后一个匹配,即cc。我们回到了第1组的时间bb
  • 引擎(...)再次尝试匹配。仅剩两个字符:cc,因此再次失败。
  • 引擎通过放弃量化组的最后一个匹配项()来 回溯 。在这一阶段,第1组再次出现。(..)+``bb``aa
  • 引擎(...)再次尝试匹配。成功:组2为bbc,组1为aa

参考

  • 捕获组编号和命名:血腥细节
  • 反向引用


 类似资料:
  • 以下是全部代码: 输出是: 编译器背后发生了什么导致了这些结果?

  • 问题内容: 这是有效的,并返回JavaScript中的字符串 为什么?这是怎么回事 问题答案: 如果我们将其拆分,则混乱等于: 在JavaScript中,确实是这样。将某物转换为数字,在这种情况下,它将降为或(请参见下面的规范详细信息)。 因此,我们可以简化它(优先于): 因为意思是:从中获取第一个元素,所以确实: 返回内部数组()。由于引用,说错了,但是让我们调用内部数组以避免错误的表示法。 在

  • 我从JS开始,实际上喜欢异步方面(来自Python),但我不确定为什么有些函数返回Promise。具体来说,下面使用的代码让我想知道返回了什么: 除了流之外,我们在之后得到的HTTP响应是一个文本块,客户端稍后会对其进行解释,以提取标题、正文和其他有趣的元素,作为HTTP内容分析的一部分。 关键是这个文本块是一块的,所以第一个已经有了整个响应——为什么JSON主体的解析是异步操作,不同于第二个?

  • 这不是重复的...在我看来。我不是在问它的有用性。如果可以的话,我要求澄清定义。不要投反对票,请解释一下。如果我认为这篇文章对其他读者来说很愚蠢,我会删除它。 其中显示是这样的 如果后面是什么?:应为“普通括号的非捕获版本”。匹配括号内的任何正则表达式,但在执行匹配或稍后在模式中引用后,无法检索组匹配的子字符串。” 为什么它仍然返回字符串“animal=”? (Python 3.6.3)f是:

  • 这些叫什么?在powershell中编写脚本时,我可以使用它们来设置或转换变量的数据类型,但这是什么术语呢?这些有官方文件吗? 示例:

  • 我正在regex101上测试这个。通用域名格式 正则表达式: 测试字符串: 字符串匹配,但“匹配信息”框显示只有两个捕获组: 我期待着所有这些捕捉: β-bar baz-bz fd zz 为什么周期之间的每个标识符都没有被识别为自己捕获的组?