2017-05-02 14 views
1

私は次のように動作するPythonの正規表現を書こうとしています...母音(a、e、私、o、u、á、é、 (a、e、i、o、u、á、é、í、ó)の後に続くコロン(:)の後ろに別の母音結腸。したがって、母音の間のコロンはオプションですが、母音の間にあれば、母音が出力に存在する必要があります。だから私は(:)?を使ってみました。そのパターンが一致すると、最後のコロンが削除されます。鋭いアクセントの母音は全く異なる母音とみなされます。したがって、aáとは異なる母音と見なされます。以下は別の表現です。Pythonの正規表現は、任意の文字と文字のグループ

V = a,e,i,o,u,á,é,í,ó,ú 
V:V: will become V:V 
VV: will become VV 

両方のパターンで、2番目の母音の後のコロンは常に削除されます。しかし、コロンが両方の母音の間に存在する場合、それは出力に存在します。

以下は、適用すべきパターンとそのために必要なものです。以下は

a:é: will become a:é // colon between the vowels is present in the output, colon after the two vowels is dropped from output 
ia: will become ia // colon after the two vowels is dropped from output 
ó:a: will become óa // colon between the vowels is present in the output, colon after the two vowels is dropped from output 

私がしようとしてきたが、それは働いていないものです:

word = re.sub(ur"([a|e|i|o|u|á|é|í|ó|ú])(:)?([a|e|i|o|u|á|é|í|ó|ú]):", ur'\1\3', word) 
+0

例パターンの所望の出力は何ですか? –

+2

なぜこれは 'a:é:> a:é'と' ':a:>ó''と違うのですか?両方とも同じ構文をしています。 – sln

+0

'r '\ 1 \ 3''を' r' \ 1:\ 3''に変更した後、私は最初の2つの例について期待される出力を得ました。 – DyZ

答えて

0

あなたの例のパターンは、あなたの説明と一致していません。あなたの説明に合った模範的なパターンとRegExがあります。

コード:

import re 
V = u'aeiouáéíóú' 
RE = re.compile('([%s])(:?)([%s]):' % (V, V)) 

word = RE.sub(r'\1\2\3', word) 

テストコード:

data = (
    (u'a:é:', u'a:é'), 
    (u'ia:', u'ia'), 
    (u'ó:a', u'ó:a'), 
) 

for w1, w2 in data: 
    print(w2, RE.sub(r'\1\2\3', w1)) 
    assert w2 == RE.sub(r'\1\2\3', w1) 

結果:

(u'a:\xe9', u'a:\xe9') 
(u'ia', u'ia') 
(u'\xf3:a', u'\xf3:a') 
関連する問題