尝试在Python中学习正则表达式,以查找具有连续元音 - 辅音或辅音 - 元音组合的单词。我如何在正则表达式中执行此操作?如果在Regex中无法完成,那么在Python中有没有一种有效的方法呢?
答案 0 :(得分:11)
我相信你应该能够使用这样的正则表达式:
r"([aeiou][bcdfghjklmnpqrstvwxz])+"
用于匹配元音后跟辅音和:
r"([bcdfghjklmnpqrstvwxz][aeiou])+"
用于匹配辅音,然后是元音。作为参考,+表示它将匹配它可以找到的该模式的最大重复。例如,将第一个模式应用于“ababab”将返回整个字符串,而不是单个出现的“ab”。
如果你想匹配一个或多个元音后跟一个或多个辅音,它可能看起来像这样:
r"([aeiou]+[bcdfghjklmnpqrstvwxz]+)+"
希望这有帮助。
答案 1 :(得分:3)
^(([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')
>>>
答案 2 :(得分:2)
如果将辅音有向图映射为单个辅音,则最长的单词 anatomicopathological 为10 * VC字符串。
如果您正确映射 y ,那么您将获得完整的字符串,例如 acetylacetonates 为8 * VC, hypocotyledonary 为8 * CV。
如果您不需要整个字符串,则在 chemicomineralogical 中获得9 * CV模式,在 overimaginative中获得9 * VC模式。
如果允许连续辅音或元音的运行,有许多10 *个单词,如(C+V+)+
中所示。这些包括腹腔镜子宫切开术和输尿管膀胱切除术。
主要技巧是首先将所有辅音映射到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
然后主要技巧是通过
寻找VC或CV交替的重叠匹配 (?= ( (?: \p{IsVowel} \p{IsConsonant} ) )+ ) )
和
(?= ( (?: \p{IsConsonant} \p{IsVowel} ) )+ ) )
然后你计算所有那些,看看哪些是最长的。
但是,由于Python支持没有(默认情况下/直接)支持regex中的属性,就像我将它们用于我自己的程序一样,这使得首先将字符串预处理为 C更为重要和 V 。否则你的模式看起来很难看。