问题描述
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()
,返回整个匹配对象,包括结尾辅音。
你有两种方法可以得到结果,
- 保留当前模式并使用
i.group(1)
获取第 1 组中的匹配项而不是整个匹配项。 - 对像
(?=[%s])
这样的辅音结尾使用先行断言,那么匹配的字符串将只有元音。