Последовательность подсчета гласных - PullRequest
3 голосов
/ 04 ноября 2010

Это не вопрос домашнего задания, это вопрос о подготовке к экзамену.

Я должен определить функцию syllables(word), которая подсчитывает количество слогов в слове следующим образом:

• максимальная последовательность гласных - это слог;

• финал e в слове не является слогом (или последовательностью гласных, в которую он входит).

Мне не нужно иметь дело с какими-либо особыми случаями, такими как, наконец, e в односложном слове (например, «be» или «bee»).* Должен ли я использовать регулярное выражение здесь или просто составить список?

Ответы [ 9 ]

2 голосов
/ 04 ноября 2010

Использовать регулярные выражения - большинство языков позволяют подсчитывать количество совпадений регулярного выражения в строке.

Затем в специальном случае терминал-e проверяет самую правую группу совпадений.

2 голосов
/ 04 ноября 2010

Я нахожу регулярные выражения естественными для этого вопроса. (Я думаю, что для ответа без регулярного выражения потребовалось бы больше кодирования. Я использую два строковых метода: lower и endwith, чтобы сделать ответ более ясным.

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

Обратите внимание, что у «decodes» есть еще один слог, чем «decode» (что странно, но соответствует вашему определению).

Вопрос. Как это поможет вам? Разве вопрос исследования не в том, что вы сами прорабатываете его? В будущем вы можете получить больше пользы, разместив неудавшуюся попытку в своем вопросе, чтобы вы могли узнать, где именно вам не хватает.

1 голос
/ 04 ноября 2010

Вот ответ без регулярных выражений. Мой реальный ответ (также опубликованный) использует регулярные выражения. Непроверенный код:

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
1 голос
/ 04 ноября 2010

Некоторые указатели:

[abc] соответствует a, b или c.

A + после того, как токен регулярного выражения позволяет токену совпадать один или несколько раз

$ соответствует концу строки.

(?<=x) соответствует текущей позиции, только если предыдущий символ соответствует x.

(?!x)текущая позиция, только если следующий символ не является x.

РЕДАКТИРОВАТЬ:

Я только что увидел ваш комментарий, что, поскольку это не домашняя работа, фактический кодпросил.Ну, тогда:

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

Если вы не хотите считать окончательные последовательности гласных, заканчивающиеся на e (например, u в tongue или o в toe), затем используйте

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

Я уверен, что вы сможете понять, как это работает, если прочитаете объяснение выше.

1 голос
/ 04 ноября 2010

Я не думаю, что регулярное выражение здесь - правильное решение.

Кажется довольно простым написать это, рассматривая каждую строку как список.

0 голосов
/ 04 ноября 2010

Этот шаблон работает для вашего определения:

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

Просто посчитай, сколько раз это происходит.

0 голосов
/ 04 ноября 2010

Используйте регулярное выражение, соответствующее a, e, i, o или u, преобразуйте строку в список, затем выполните итерацию по списку ... 1 для первого true, 1 для следующего false, 2 для следующего true, 2для следующего ложного и т. д.

Чтобы обработать случай, когда последняя буква «е» следует за согласной (как в ели), просто проверьте последние две буквы слова перед началом.Если они совпадают с этим шаблоном, обрежьте окончательный e и обработайте как обычно.

0 голосов
/ 04 ноября 2010

Регулярные выражения были бы слишком сложными, и понимание списка, вероятно, не было бы достаточно надежным. Вы, вероятно, сможете легко решить эту проблему, используя лексер грамматики, например PyParsing Дайте ему шанс!

0 голосов
/ 04 ноября 2010

Оба способа работают.Вы сами сказали, что это для подготовки к экзамену.Используйте то, что будет на экзамене.Если они оба на экзамене, используйте, для чего вам нужно больше практики.Просто помните:

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения».Теперь у них две проблемы.~ Джейми Завински

Так что, на мой взгляд, не используйте регулярные выражения, если вам не нужна практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...