2014-03-31 51 views
0

所以我有一个需要一个句子并返回到明胶中的函数。代码如下:当我输入一个字,但是当我输入一个句子就进入疯狂将一个句子转换成明胶

import re 
from string import ascii_uppercase 

def isvowel(ch): 
    vowels = ("a", "e", "i", "o", "u", "A", "E", "I", "O", "U") 
    for i in range(len(ch)): 
     if ch[i] in vowels: 
      return i 
    return -1 


def format(ch): 
    if any(x in ascii_uppercase for x in ch): 
     ch = ch.capitalize() 
    m = re.search(r'\W+', ch) 
    if m: 
     ch = ch.replace(m.group(0), '') + m.group(0) 
    return ch 


def igpay(astring): 
    vowels = ("a", "e", "i", "o", "u", "A", "E", "I", "O", "U") 
    words = astring.split() 
    count = 0 
    for ch in words: 
     vowel = isvowel(ch) 
     if vowel == 0: 
      astring = astring.replace(ch,(format(ch + "way"))) 
     else: 
      astring = astring.replace(ch,(format(ch[vowel:] + ch[:vowel] + "ay"))) 
    astring = astring.strip()   
    return astring 

输出工作正常。

例子: 即时得到什么:

>>>igpay("An apple a day keeps the doctor away") 
>>>'Anwawaywayy awaywaypplewawaywayy awayway dawaywayy eepskay ethay octorday  awaywaywawaywayy' 

我应该得到什么:

>>>igpay("An apple a day keeps the doctor away") 
>>>'Anway appleway away ayday eepskay ethay octorday awayway' 

如果我单独输入每个字,我得到一个正确的返回。到底是怎么回事?

+0

Icenay ogrampray :) –

回答

1

这是因为您正在修改循环中的整个句子来替换单词结尾。

相反,你应该这样做对列表中的每个字,收集字列表,并返回他们的空间加入:

def igpay(astring): 
    words = astring.split() 
    modified_words = [] 
    for ch in words: 
     vowel = isvowel(ch) 
     if vowel == 0: 
      ch = ch.replace(ch, (format(ch + "way"))) 
     else: 
      ch = ch.replace(ch, (format(ch[vowel:] + ch[:vowel] + "ay"))) 
     modified_words.append(ch.strip()) 
    return ' '.join(modified_words) 

用法示例(正是你要找的人):

>>> igpay("An apple a day keeps the doctor away") 
'Anway appleway away ayday eepskay ethay octorday awayway'