2011-05-21 32 views

回答

10

我相信你應該能夠使用正則表達式是這樣的:

r"([aeiou][bcdfghjklmnpqrstvwxz])+" 

緊隨其後的是輔音元音和匹配:

r"([bcdfghjklmnpqrstvwxz][aeiou])+" 

爲匹配輔音,然後是元音。作爲參考,+意味着它將匹配它可以找到的這種模式的最大重複。例如,將第一個模式應用於「ababab」會返回整個字符串,而不是「ab」的單個出現。

如果你想匹配一個或多個元音後面有一個或多個輔音它可能是這樣的:

r"([aeiou]+[bcdfghjklmnpqrstvwxz]+)+" 

希望這有助於。

+1

我如何找到具有最連續的元音 - 輔音匹配序列的單詞? – Parseltongue 2011-05-21 07:27:11

+1

當你找到它時,存儲匹配的長度。爲了將來的參考,你應該在提問後儘量不要改變這個問題。 – katrielalex 2011-05-21 08:44:56

+2

@katrielalex - 雖然不幸,但最初的答案很有助於澄清海報的問題,所以這個問題會隨着發展而變化。在解析問題時,我已經有了幾十個步驟 - 請參閱http://www.python-forum.org/pythonforum/viewtopic.php?f=3&t=25288&start=80&sid=466b3473819c36063b68f10d580a4e7c – PaulMcG 2011-05-21 14:41:31

2
^(([aeiou][^aeiou])+|([^aeiou][aeiou])+)$ 

>>> import re 
>>> consec_re = re.compile(r'^(([aeiou][^aeiou])+|([^aeiou][aeiou])+)$') 
>>> consec_re.match('bale') 
<_sre.SRE_Match object at 0x01DBD1D0> 
>>> consec_re.match('bail') 
>>> 
+0

完美運作。謝謝 – Parseltongue 2011-05-21 06:39:53

+0

當有不均勻的元音/輔音時,似乎不起作用。 'consec_re.match('hiben')'例如失敗。 – 2011-05-21 06:49:48

+0

-1:這匹配任何非元音而不是輔音。例如,''consec_re.match('ba7e')''返回一個匹配。 – Blair 2011-05-21 06:59:26

2

如果您將輔音有向圖映射爲單個輔音,則最長的詞是anatomicopathological作爲10 * VC字符串。

如果你正確地映射Ÿ,那麼你得到完整的串像乙酰丙酮爲8 * VC和hypocotyledonary爲8 * CV。

如果您不需要字符串是整體,你在chemicomineralogical得到一個9 * CV模式和overimaginativeness一個9 * VC模式。

如果連續輔音或元音運行允許交替使用,則有許多10 *字,如(C+V+)+。這些包括laparocolpohysterotomyureterocystanastomosis

主要技巧是首先映射所有輔音到C和所有元音到V,然後進行VC或CV匹配。對於Y,你必須做前視和/或後視以確定它是否映射到該位置的C或V.

可能告訴你我使用的模式,但你可能不會對我感到滿意。 :)例如:

(?<= \p{IsVowel})  [yY] (?= \p{IsVowel}) # counts as a C 
(?<= \p{IsConsonant}) [yY]     # counts as a V 
         [yY] (?= \p{IsVowel}) # counts as a C 

主要的竅門就變成了尋找通過

(?= ((?: \p{IsVowel}  \p{IsConsonant}) )+)) 

(?= ((?: \p{IsConsonant} \p{IsVowel} ) )+)) 

重疊的VC或CV交替的比賽之一,那麼你算上所有這些了並查看哪些是最長的。

然而,由於支持Python沒有(默認/直接)在正則表達式的支持性我只是用他們自己的程序的方式,這使得它更重要的是首先預處理串入不過Ç的和V's。否則你的模式看起來很醜。