【问题标题】:How do I match vowels?如何匹配元音?
【发布时间】:2011-02-17 21:18:03
【问题描述】:

我正在处理一个更大的程序的一个小组件时遇到问题。基本上我需要让用户输入一个单词,并且我需要打印第一个元音的索引。

word= raw_input("Enter word: ")
vowel= "aeiouAEIOU"

for index in word:
    if index == vowel:
        print index

但是,这不起作用。怎么了?

【问题讨论】:

  • 今后请尽量为您的问题提供更具描述性的标题。
  • 一个小提示:在循环中,您将 'vowel' 的全部内容与给定单词的每个字母进行比较

标签: python loops


【解决方案1】:

同样的想法使用list comprehension:

word = raw_input("Enter word: ")
res = [i for i,ch in enumerate(word) if ch.lower() in "aeiou"]
print(res[0] if res else None)

【讨论】:

    【解决方案2】:

    试试:

    word = raw_input("Enter word: ")
    vowels = "aeiouAEIOU"
    
    for index,c in enumerate(word):
        if c in vowels:
            print index
            break
    

    for .. in 将遍历字符串中的实际字符,而不是索引。 enumerate 将返回索引以及字符,使两者的引用更容易。

    【讨论】:

    • 感谢您提醒我们能够使用“for ... in”关键字在字符串中进行搜索!
    【解决方案3】:

    只是为了与众不同:

    import re
    
    def findVowel(s):
        match = re.match('([^aeiou]*)', s, flags=re.I)
        if match:
            index = len(match.group(1))
            if index < len(s):
                return index
        return -1  # not found
    

    【讨论】:

    • 不起作用,re.match() 只匹配字符串的开头。您必须改用re.search()。而您正在寻找不是元音的字母。
    • 嗯,实际上它工作正常(虽然我同意它不是最优雅的);从字符串的开头开始,我得到尽可能多的非元音。如果结果与原始字符串长度相同,则没有元音,因此返回 -1(与 str.find() 的用法模式相同);否则返回匹配长度(= 第一个元音的索引)。
    • @Chinmay:如果你要对我投反对票,如果有一个真正正确的理由,那将是很好;如果做不到这一点,最好不要被否决。就像一个微妙的暗示。
    • 抱歉,我并没有完全理解你第一次在做什么。现在它不会让我收回我的投票:(
    • PS:当我累了时,我真的应该学会不要对答案(向上或向下)投票。如果您进行了无关紧要的编辑,我可以删除反对票。
    【解决方案4】:

    index == vowel 询问字母索引是否等于整个元音列表。您想知道的是它是否包含在元音列表中。请参阅其他一些答案以了解其工作原理。

    【讨论】:

      【解决方案5】:

      另一种解决方案,可以说是一种更优雅的解决方案,是使用re 库。

      import re
      word = raw_input('Enter a word:')
      try: 
          print re.search('[aeiou]', word, re.I).start()
      except AttributeError:
          print 'No vowels found in word'
      

      本质上,re 库实现了一个正则表达式匹配引擎。 re.search() 在第二个字符串中搜索第一个字符串指定的正则表达式并返回第一个匹配项。 [aeiou] 表示“匹配 a 或 e 或 i 或 o 或 u”,re.I 告诉 re.search() 使搜索不区分大小写。

      【讨论】:

      • 更好 - 我不知道 SRE_Match.start() 方法。生活和学习;-)
      【解决方案6】:
      for i in range(len(word)):
        if word[i] in vowel:
          print i
          break
      

      会做你想做的。

      "for index in word" 循环遍历 word 的字符而不是索引。 (您可以使用“枚举”函数将索引和字符一起循环;我会让您自己查找。)

      【讨论】:

      • -1。不要鼓励不良做法。 enumerate 是在这里要做的 Pythonic 事情。
      • 我的目的不是鼓励不良实践,而是为那些显然是初学者的人提供尽可能容易理解的东西,同时指出更 Pythonic 的东西,以便在闲暇时查阅。哦,好吧。
      猜你喜欢
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 2011-01-16
      相关资源
      最近更新 更多