在Python中使用正则表达式查找符合模式的单词:元音、辅音、元音、辅音
我正在学习Python中的正则表达式(Regex),想找出那些有连续元音和辅音组合的单词,比如元音后面跟辅音,或者辅音后面跟元音。请问我该如何用正则表达式来实现这个呢?如果正则表达式做不到,有没有其他高效的方法在Python中实现这个功能?
3 个回答
如果把辅音双字母组合映射成单个辅音,那么最长的这样的单词是 anatomicopathological,它可以表示为一个10*VC的字符串。
如果你正确地处理y,那么你会得到像 acetylacetonates 这样的完整字符串,它是8*VC的,还有 hypocotyledonary,它是8*CV的。
如果你不需要字符串是完整的,那么你可以在 chemicomineralogical 中得到一个9*CV的模式,在 overimaginativeness 中得到一个9*VC的模式。
如果允许连续的辅音或元音交替出现,就会有很多10*的单词,比如 laparocolpohysterotomy 和 ureterocystanastomosis。
主要的技巧是先把所有辅音映射为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的支持默认并不直接支持我刚才在自己程序中使用的正则表达式属性,所以首先把字符串处理成只有 C 和 V 是非常重要的。否则你的模式看起来会很难看。
我认为你可以使用这样的正则表达式:
r"([aeiou][bcdfghjklmnpqrstvwxz])+"
这个表达式可以用来匹配元音字母后面跟着辅音字母的情况:
r"([bcdfghjklmnpqrstvwxz][aeiou])+"
而这个则是用来匹配辅音字母后面跟着元音字母的情况。顺便提一下,符号 + 的意思是它会匹配这个模式中能找到的最大重复次数。比如,把第一个模式应用到 "ababab" 这个字符串上时,它会返回整个字符串,而不是单独的 "ab"。
如果你想匹配一个或多个元音字母后面跟着一个或多个辅音字母,可能会像这样:
r"([aeiou]+[bcdfghjklmnpqrstvwxz]+)+"
希望这对你有帮助。