我想写一个将单词分成cvc(辅音/元音/辅音)或vcv组的正则表达式。类似于ngrams但使用voyels和辅音的东西。这是一个例子:
helloworld
将生成以下组:
hell
ello
llow
owo
world
我写了以下正则表达式:
(?=(([aeiouy]+|[^aeiouy]+){3}))
第一部分([aeiouy]+|[^aeiouy]+){3}
捕获vcv或cvc组,其余(?=( ))
是一个积极的先行断言。
它没有按预期工作:
hell
ello
llow
low //owo expected
答案 0 :(得分:1)
如果单独使用前瞻,则不会消耗字符,并且解析器会尝试字符串中的所有位置(换句话说,它一次不能跳过多个字符)。
您可以像这样解决问题:
(?=((?:[aeiou]+|[b-dfghj-np-tv-z]+){3}))(?:[aeiou]+|[b-dfghj-np-tv-z]+)
现在每个比赛(前瞻之外)消耗了主要的元音(或辅音)。
答案 1 :(得分:0)
通过将所有模式放入前瞻部分,您可以在选择起始匹配点时非贪婪。改为使用一个显式和两个先行V / C序列:
r = re.compile('(?:([aeiouy]+)(?=([^aeiouy]+[aeiouy]+)))|(?:([^aeiouy]+)(?=([aeiouy]+[^aeiouy]+)))')
然后简单地连接组
map (lambda l:''.join(l), re.findall(r,"Helloworld"))