2017-01-21 4 views
3

の文字 'a'、 'e'、 'i'、 'o'、 'u'のそれぞれを正確に一度一致させたい場合は、 オーダー、それは単語コーパスからの他の英語の単語と一致しません。 これまで私はコーパスからすべてのa、e、i、o、uの単語を得ることができましたが、いくつかの単語は母音を複数回表示しています。例えば、私は見ている間に 'abietineous' 「棄権」のような言葉だけ。間違った結果を取得する

ここに私のコードのスニペットがあります。それらの結果を得るためにREを修正するのを手伝ってください。

[w for w in wordlist if re.search('[a].* [e].* [i].* [o].* [u].', w)] 

注:私は言葉だけで、電子を含む欲しい、私、O、U - の順とA、Eに、私は、O、Uは一度だけ現れなければなりません。

おかげ

+0

を。 – Kasramvd

+0

しかし、角カッコ[]では1文字に制限されていませんか? –

+0

これは、任意の文字の任意の組み合わせに一致する '。*'とは関係ありません。 – Kasramvd

答えて

3

あなたの正規表現は.修飾子は、任意の文字と一致していることで予想外の言葉に一致する理由(私はスペースを入れない限り、*私のコード内のスペースのために申し訳ありませんが、フォーマットが私のアスタリスクをキャプチャされませんでした)。あなたが特別なものの間の文字を制限する必要があることを取り除きたい場合。その場合、母音以外のものと一致するネゲートされた文字クラスを使用する必要があります。

^[^aouie]*a[^aeoui]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*$ 

デモ:あなたがループ内であなたの正規表現を使用したいので、それは外のあなたの正規表現をコンパイルした方が良いということ

regex = re.compile(r'[^aouie]*a[^aeoui]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*') 
[w for w in wordlist if regex.match(w)] 

注:https://regex101.com/r/Wp2I6H/2

だから今、あなたが期待する言葉を見つけることができますPythonがそれぞれの反復で正規表現をコンパイルするのではなく、ループ内でコンパイルしたものをループ内で使用します。正規表現は単語全体と一致するので、検索の代わりにre.matchを使用することもできます。

+0

正規表現のデモとここでは同じではない? – MYGz

+0

@MYGzああ、私は保存する前にあなたの正規表現をテストしようとしていたと思う;) – Kasramvd

+0

@MYGzとKasramvdあなたのおかげで、私はコードを使ってそれを得ることができました:[wあなたは、私が使っているのですが、私はあなたの人生の中で、私たちの大学が委託しているpythonやnltk用のjuypterノートブックなどをインポートした後、そのコードを実行すると期待される結果が得られます。 –

1

これを試してみてください: `.`は任意の文字に一致するためです

import re 
wordlist = ['education', 'abstemious', 'automobile', 'facetious', 'regulation', 'novowel', 'afacetiousman', 'aeiou', 'aaeioou', 'aieou'] 
vowels = ['a','e','i','o','u'] 
novowel = '[^'+''.join(vowels)+']*' 
pattern = ''.join([novowel + v + '{1}' for v in vowels]) + novowel + '$' 
print pattern 
#[^aeiou]*a{1}[^aeiou]*e{1}[^aeiou]*i{1}[^aeiou]*o{1}[^aeiou]*u{1}[^aeiou]*$  
prog = re.compile(pattern) 
print list(filter(lambda w: prog.match(w), wordlist)) 
# ['abstemious', 'facetious', 'aeiou']