注意:我进入正则表达式并且我知道正则表达式在这种情况下不是最佳解决方案,但我仍然对如何以及是否可能感兴趣。
任务:
您将获得一个包含不同单词的文本块。这些话是 由空格和标点符号分隔。数字不是 考虑到这个任务中的单词(字母和数字的混合不是一个 或者说)。你应该计算单词数(条纹单词) 辅音元音交替的元音,即;那句话 你算不能连续两个元音或辅音。话说 由单个字母组成的不是条纹 - 不计算那些。 套管对于这项任务并不重要。
输入:文本作为字符串(unicode)
输出:一个条数字的数量为整数。
例如: string1 ="狗,猫,老鼠,鸟。人。"应该返回3.
答案 0 :(得分:2)
嗯,我认为还有两种主要方法,首先检查元音和辅音是否交替。
例如,要检查a
和b
是否有替代,您可以使用以下内容:
a(?:ba)+|b(?:ab)+
将此扩展为元音/辅音,你可以得到这个相当长的正则表达式:
(?<![a-z])(?:[aeiou](?:[^P{L}aeiou][aeiou])+|[^\P{L}aeiou](?:[aeiou][^\P{L}aeiou])+)(?![a-z])
两个否定的外观(?<![a-z])
和(?![a-z])
充当单词边界,并确保检查整个单词。
[aeiou]
用于元音,[^P{L}aeiou]
用于辅音。它相当于[b-df-hj-np-tv-z]
第二种方法是确保单词中没有连续的元音或辅音。而这个需要另一个消极的前瞻,但是要短一点:
(?<![a-z])(?:(?![aeiou]{2}|[^\P{L}aeiou]{2})[a-z])+(?![a-z])
您可以re.findall
使用re.I
有效(或在正则表达式的开头使用(?i)
)来获取所有匹配项,然后获取列表的长度以获取计数条纹词语&#39;。
(?<![a-z]) # Ensure no letter before
(?:
(?!
[aeiou]{2} # Ensure no two consecutive vowel
|
[^\P{L}aeiou]{2} # Ensure no two consecutive consonant
)
[a-z] # Any letter
)+
(?![a-z]) # Ensure no more letters