为什么 re.group 函数没有给我预期的输出

问题描述

import re

v = "aeIoU"
c = "qwrtypsdfghjklzxcvbnm"
m = re.finditer(r"(?<=[%s])([%s]{2,})[%s]" % (c,v,c),input(),flags=re.I)
for i in m:
    print(i.group())

以上代码尝试使用 re.finditer 解决 hackerrank 问题,但对于输入

rabcdeefgyYhFjkIoomnpOorteeeeetmy

我的输出

eef

爱姆

有机物

eeeet

代替

ee

呜呜

欧奥

eeee

我想知道原因

解决方法

这是因为 findall()finditer() 返回不同的东西。

re 文档中,对于 findall()

如果模式中存在一个或多个组,则返回组列表

对于finditer()

返回一个迭代器,在字符串中 RE 模式的所有非重叠匹配上产生匹配对象。

在您的情况下,当您将 findall() 与组一起使用时,整个匹配项将被忽略,它只返回组中的元音列表。但是对于 finditer(),返回整个匹配对象,包括结尾辅音。

你有两种方法可以得到结果,

  1. 保留当前模式并使用 i.group(1) 获取第 1 组中的匹配项而不是整个匹配项。
  2. 对像 (?=[%s]) 这样的辅音结尾使用先行断言,那么匹配的字符串将只有元音。