元音序列计数

时间:2010-11-04 16:46:54

标签: python regex nlp

这不是一个家庭作业问题,而是一个考试准备问题。

我应该定义一个函数syllables(word)来计算音节的数量 通过以下方式说出一句话:

•元音的最大序列是音节;

•单词中的最终 e 不是音节(或元音序列,它是一个部分 的)。

我不需要处理任何特殊情况,例如最终的 e 单音节词(例如,'be'或'bee')。

>>> syllables(’honour’)
2
>>> syllables(’decode’)
2
>>> syllables(’oiseau’)
2

我应该在这里使用正则表达式还是只列出理解?

9 个答案:

答案 0 :(得分:2)

使用regexps - 大多数语言都可以让你计算字符串中正则表达式的匹配数。

然后通过检查最右边的匹配组来对终端-e进行特殊处理。

答案 1 :(得分:2)

我发现这个问题的正则表达式很自然。 (我认为非正则表达式的答案需要更多编码。我使用两种字符串方法,'lower'和'endswith'来使答案更清晰。)

import re
def syllables(word):
    word = word.lower()
    if word.endswith('e'):
        word = word[:-1]
    count = len(re.findall('[aeiou]+', word))
    return count

for word in ('honour', 'decode', 'decodes', 'oiseau', 'pie'):
    print word, syllables(word)

打印哪些:

honour 2
decode 2
decodes 3
oiseau 2
pie 1

请注意,“解码”比“解码”还有一个音节(这很奇怪,但符合您的定义)。

问题。这对你有什么帮助?研究问题的重点不是你自己完成的吗?通过在您的问题中发布失败的尝试,您将来可能会获得更多好处,因此您可以准确了解您缺少的位置。

答案 2 :(得分:1)

我不认为正则表达式是正确的解决方案。

写这个将每个字符串视为列表似乎非常简单。

答案 3 :(得分:1)

一些指示:

[abc]匹配abc

正则表达式令牌后的+允许令牌匹配一次或多次

$匹配字符串的结尾。

仅当前一个字符为(?<=x)时,

x才会匹配当前位置。

仅当下一个字符不是(?!x)时,

x才会匹配当前位置。

修改

我刚看到您的评论,因为这不是作业,所以请求实际代码。 好吧,那么:

[aeiou]+(?!(?<=e)$)

如果您不想计算以e结尾的最终元音序列(例如u中的tongueo中的toe }),然后使用

[aeiou]+(?=[^aeiou])|[aeiou]*[aiou]$

如果您阅读上述说明,我相信您将能够弄清楚它是如何工作的。

答案 4 :(得分:1)

这是没有正则表达式的答案。我的真实答案(也发布)使用正则表达式。未经测试的代码:

def syllables(word):
    word = word.lower()
    if word.endswith('e'):
        word = word[:-1]
    vowels = 'aeiou'
    in_vowel_group = False
    vowel_groups = 0
    for letter in word:
        if letter in vowels:
            if not in_vowel_group:
                in_vowel_group = True
                vowel_groups += 1
        else:
            in_vowel_group = False
    return vowel_groups

答案 5 :(得分:0)

两种方式都有效。你自己说这是为了准备考试。使用考试中的任何一个。如果他们都在考试中,请使用您需要更多练习。记住:

  

有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 〜杰米·扎温斯基

所以在我看来,除非你需要练习,否则不要使用正则表达式。

答案 6 :(得分:0)

正则表达式太复杂了,列表理解可能不够健壮。您可能可以使用像PyParsing这样的语法词法分析器轻松解决这个问题。试一试!

答案 7 :(得分:0)

使用匹配a,e,i,o或u的正则表达式,将字符串转换为列表,然后遍历列表... 1表示第一个为真,1表示下一个错误,2表示下一个为真,2对于下一个假等等。

要处理辅音后面的最后一个字母是'e'的情况(如在ate中),只需在开始前检查单词的最后两个字母。如果它们与该模式匹配,则截断最终e并正常处理。

答案 8 :(得分:0)

此模式适用于您的定义:

(?!e$)([aeiouy]+)

只计算发生的次数。