【问题标题】:Python add string before every vowelPython在每个元音之前添加字符串
【发布时间】:2016-01-22 15:06:41
【问题描述】:

我正在编写一个 python 代码,它采用单行估算的文本并在每个元音之前添加字符串“tak”(如果它没有开始一个单词,则 y 仅计为元音)例如“我喜欢睡觉”会出来“takI ltakitake sltaketakep”。我才刚刚开始学习编码,因此还不知道太多复杂的功能。下面是我到目前为止的代码,它根本不起作用。

text = raw_input("enter the text to be translated")
textSplit = text.split()
count = 0
print len(textSplit)
Vowels = ["a","e","i","o","u"]
while count <= len(text):
  for i in textSplit:
    for i in Vowels:
      count += 1

但是,我无法弄清楚如何对字符串进行切片、添加“tak”并将其连接起来。 谢谢。

编辑:不使用text.replace 模块可以做到吗?

【问题讨论】:

标签: python python-2.7


【解决方案1】:

您可以使用regex:

>>> re.sub(r'(?i)([aeiou])', r'tak\1', "I like sleep") 
'takI ltakiktake sltaketakep'

您也可以使用str.replace,方法是为每个元音循环一次字符串。不要忘记字符串在 Python 中是不可变的,因此您每次都必须创建一个新字符串:

>>> s="I like sleep"
>>> for v in 'aeiouAEIOU':
...    s=s.replace(v, 'tak'+v)
... 
>>> s
'takI ltakiktake sltaketakep'

在这种情况下,如果未找到元音,则字符串s 与之前相同,或者每个元音都被连接到元音的字符串tak 替换。每次循环都会在任一情况下创建一个新字符串并分配给s。

【讨论】:

    【解决方案2】:

    你可以使用re.sub:

    re.sub(r'([aeiou])', r'(exampleReplace)\1', text)
    

    例子:

    text = 'Text'
    print(re.sub(r'([aeiou])', r'(exampleReplace)\1', text))
    >> T(exampleReplace)ext
    

    【讨论】:

    • 我在尝试同样的事情,但是由于某种原因,元音在结果中消失了,这个 \1 在替换文本中究竟做了什么?
    • 是捕获组([aeiou]),是找到的元音
    • 我正在尝试这个print(re.sub(r'([aeiou])', r'(exampleReplace)', text)) ,它会替换元音,如果我使用r'(exampleReplace)\1' 作为替换字符串,元音会留在那里
    【解决方案3】:

    如果您需要忽略任何前导的 'y',则必须稍微调整一下:

    text = raw_input("enter the text to be translated")
    
    temp1 = temp2 = text[1:] if text[0] in ['y', 'Y'] else text
    
    for vowel in ['a', 'e', 'i', 'o', 'u', 'y']:
        temp2 = temp2.replace(vowel, 'tak{}'.format(vowel))
        temp2 = temp2.replace(vowel.upper(), 'tak{}'.format(vowel.upper()))
    
    text = text.replace(temp1, temp2)
    print text
    

    对于“我喜欢睡觉”的输入,这给出:

    takI ltakiktake sltaketakep
    

    '黄色':

    ytakelltakow
    

    '火鸡':

    ttakurktaketaky
    

    如果出于某种原因,您真的不想使用str.replace,您可以这样做:

    text = raw_input("enter the text to be translated")
    
    temp2 = text[1:] if text[0] in ['y', 'Y'] else text
    vowels = ['a', 'e', 'i', 'o', 'u', 'y']
    
    temp2 = ''.join(['tak{}'.format(letter) if letter.lower() in vowels else letter for letter in temp2])
    
    if text[0] in ['y', 'Y']:
        text = text[0] + temp2
    else:
        text = temp2
    
    print text
    

    【讨论】:

    • 是的。我提供了一个避免str.replace 的解决方案
    【解决方案4】:

    使用 list() 代替 split()。我还使用enumerate 同时获取索引和值。 修改代码:

    text = "I like banana"
    textSplit = list(text)
    Vowels = ["a","e","i","o","u"]
    for index,letter in enumerate(textSplit):
        if letter.lower() in Vowels:
            textSplit[index] = "tak" + letter
    print "".join(textSplit)
    

    输出:

    takI ltakiktake btakantakantaka
    

    【讨论】:

      【解决方案5】:

      以下方法可行:

      text = 'I like sleep'
      vowels = set("aeiou")
      modified_text = ''.join(['tak'+letter if letter.lower() in vowels else letter for letter in text])
      print(modified_text)
      

      输出

      takI ltakiktake sltaketakep
      

      (注意:我认为您的示例输出中缺少k)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-22
        • 1970-01-01
        • 2019-01-14
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 2019-10-29
        相关资源
        最近更新 更多