这不是一个家庭作业问题,而是一个考试准备问题。
我应该定义一个函数syllables(word)
来计算音节的数量
通过以下方式说出一句话:
•元音的最大序列是音节;
•单词中的最终 e 不是音节(或元音序列,它是一个部分 的)。
我不需要处理任何特殊情况,例如最终的 e 单音节词(例如,'be'或'bee')。
>>> syllables(’honour’)
2
>>> syllables(’decode’)
2
>>> syllables(’oiseau’)
2
我应该在这里使用正则表达式还是只列出理解?
答案 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]
匹配a
,b
或c
。
正则表达式令牌后的+
允许令牌匹配一次或多次
$
匹配字符串的结尾。
(?<=x)
时, x
才会匹配当前位置。
(?!x)
时, x
才会匹配当前位置。
修改强>
我刚看到您的评论,因为这不是作业,所以请求实际代码。 好吧,那么:
[aeiou]+(?!(?<=e)$)
如果您不想计算以e
结尾的最终元音序列(例如u
中的tongue
或o
中的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]+)
只计算发生的次数。