2013-02-22 2 views
0

Я пытаюсь взять строку в качестве входных данных и вернуть ту же строку с каждым гласным, умноженным на 4, и "!" добавлено в конце. Ex. «hello» возвращается, «heeeelloooo!»Умножение гласных в строку

def exclamation(s): 
'string ==> string, returns the string with every vowel repeating four times and an exclamation mark at the end' 
vowels = 'aeiouAEIOU' 
res = '' 
for a in s: 
    if a in vowels: 
     return s.replace(a, a * 4) + '!' 

Приведенный выше код просто возвращает «heeeello!» Я также попытался это в интерактивной оболочке с гласными, равных («а», «е», «я», «о», «и»), но используя тот же код, в результате этого:

>>> for a in s: 
if a in vowels: 
    s.replace(a, a * 4) + '!' 

«heeeello !» 'helloooo!'

Как я могу заставить его умножить каждый гласный, а не только один из них?

ответ

5

Как вы, вы перебираете строку, и если символ является гласным, вы заменяете эту гласную в строке четырьмя из них, а затем останавливаете. Это не то, что вы хотите сделать. Вместо этого зациклируйте гласные и замените гласную в строке, присваивая результат обратно входной строке. Когда вы закончите, верните полученную строку с добавлением восклицательного знака.

def exclamation(s): 
    'string ==> string, returns the string with every vowel repeating four times and an exclamation mark at the end' 
    vowels = 'aeiouAEIOU' 
    for vowel in vowels: 
     s = s.replace(vowel, vowel * 4) 
    return s + '!' 
+0

Спасибо! Теперь я вижу, что я делаю неправильно. Работает отлично. – iKyriaki

8

Я лично использую регулярное выражение здесь:

import re 

def f(text): 
    return re.sub(r'[aeiou]', lambda L: L.group() * 4, text, flags=re.I) + '!' 

print f('hello') 
# heeeelloooo! 

Это имеет преимущество сканирования строки только один раз. (И ИМХО достаточно читаем, что он делает).

+1

Я до сих пор довольно новичок в python, поэтому для меня это довольно продвинуто. Он работает, но я пока не понимаю, как это сделать (возможно, в будущем я буду.) Большое спасибо за помощь в любом случае! – iKyriaki

+2

Элемент 'r '[aeiou]'' означает для любого гласного, а выражение 'lambda' означает, чтобы взять все, что соответствовало регулярному выражению, и заменить его на 4 раза этой строкой. Наконец, флаг 're.I' сообщает regex игнорировать случай (так что' 'A'' тоже будет соответствовать). –

+0

О, я вижу. Это и поиск в документах сделал его более разумным. Значит, L в «lambda L: L.group()» имеет какое-либо значение или это просто переменная? – iKyriaki

Смежные вопросы