2017-01-29 7 views
0

単語をcvc(子音/母音/子音)またはvcvグループに分割する正規表現を書いてみたいと思います。 ngramsに似ていますが、voyelsと子音を使用しています。次に例を示します。単語から子音/母音グループを抽出するには?

helloworld 

は、次のグループを生成します:

hell 
ello 
llow 
owo 
world 

私は、次の正規表現を書いている:

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

最初の部分([aeiouy]+|[^aeiouy]+){3}がVCVやCVC基のいずれかをキャプチャ、残りの部分は(?=())です。 期待通りには動作しません:あなたは一人で先読みを使用する場合は、文字が消費されない

hell 
ello 
llow 
low //owo expected 

答えて

1

、およびパーサは、文字列内のすべてのポジションをしようとします(つまり、より多くをジャンプすることができません一度に1文字)。

あなたはこのような問題を解決することができます:

demo

(?=((?:[aeiou]+|[b-dfghj-np-tv-z]+){3}))(?:[aeiou]+|[b-dfghj-np-tv-z]+) 
は今主要な母音(または子音)(先読みの外)各試合のために消費されています。

+0

この部分を連結します。?[AEIOU] + | [B-dfghj-NP- tv-z] +) 'は次のcvcまたはvcvグループにマッチする前にエンジンに一群のボイスまたは子音を消費させます。私はそれを得たと思う。質問:子音を(明示的に指定することによって)子音をどのように(子音は母音ではなくすべてであると言っているのか)対比させる方がパフォーマンスが良いのでしょうか? – tigrou

+0

@tigrou:大きな違いはないと思う。 –

0

すべてのパターンを先読み部分に入れることで、開始マッチポイントを選択する際に貪欲にすることができます。代わりに、明示的および2先読みV/Cシーケンスいずれかを使用します。

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

そして、単に( `だから、グループ

map (lambda l:''.join(l), re.findall(r,"Helloworld")) 
関連する問題