如何从单词中提取辅音/元音组?

时间:2017-01-29 15:17:04

标签: regex language-agnostic

我想写一个将单词分成cvc(辅音/元音/辅音)或vcv组的正则表达式。类似于ngrams但使用voyels和辅音的东西。这是一个例子:

helloworld

将生成以下组:

hell
ello
llow
owo
world

我写了以下正则表达式:

(?=(([aeiouy]+|[^aeiouy]+){3}))

第一部分([aeiouy]+|[^aeiouy]+){3}捕获vcv或cvc组,其余(?=( ))是一个积极的先行断言。 它没有按预期工作:

hell
ello
llow
low //owo expected

2 个答案:

答案 0 :(得分:1)

如果单独使用前瞻,则不会消耗字符,并且解析器会尝试字符串中的所有位置(换句话说,它一次不能跳过多个字符)。

您可以像这样解决问题:

(?=((?:[aeiou]+|[b-dfghj-np-tv-z]+){3}))(?:[aeiou]+|[b-dfghj-np-tv-z]+)

demo

现在每个比赛(前瞻之外)消耗了主要的元音(或辅音)。

答案 1 :(得分:0)

通过将所有模式放入前瞻部分,您可以在选择起始匹配点时非贪婪。改为使用一个显式和两个先行V / C序列:

r = re.compile('(?:([aeiouy]+)(?=([^aeiouy]+[aeiouy]+)))|(?:([^aeiouy]+)(?=([aeiouy]+[^aeiouy]+)))')

然后简单地连接组

map (lambda l:''.join(l), re.findall(r,"Helloworld"))