【问题标题】:How do I find the position of the first occurrence of a letter(from the alphabet) in a string?如何找到字符串中第一次出现的字母(来自字母表)的位置?
【发布时间】:2020-05-26 10:10:33
【问题描述】:

例如,如果字符串是

s = "##catgiraffeapluscompscI"

由于该字符串中出现的第一个字母位于位置 2 (c),如何将输出设为 2?

我也希望它也能够适用于不同的字符串(如函数),它们的首字母可能没有 c,所以我不想要

s.find('c')

【问题讨论】:

  • 你能具体说明什么是字母吗?
  • 字母表中的一个字母
  • 哪个字母?

标签: python string letter


【解决方案1】:

如果您不想导入正则表达式或其他模块:以下仅使用标准库,将忽略所有非字母字符并使用 isalpha() 方法为您提供第一个字母字符的位置。

foo = "##catgiraffeapluscompscI"

L = len(foo)

vivi = 0
for v in range(1,L):
    if foo[vivi].isalpha():
        print ("First alphabetic character " + foo[vivi] + " at position " + str(vivi))
        break
    vivi = vivi + 1    

输出:

First alphabetic character c at position 2

【讨论】:

    【解决方案2】:
    def find_index(input_string,input_value):
        return input_string.index(input_value))
    answer = find_index("##catgiraffeapluscompscI", 'c')
    print(answer)
    

    【讨论】:

    • 这只有在您已经知道第一个字母是什么的情况下才有效。
    • 如果未找到子字符串,您可以使用异常处理返回 None。如果您只关心查找子字符串,那么这是理想的选择,而不是使用单独的库。但是,如果您想使用一些基于自动机理论的高级模式匹配,那么 RE 可能是需要关注的领域。
    • 不是处理not-found的问题;就是它没有解决这个问题。这个答案返回字母“c”的第一个位置; OP 要求任何字母的第一个位置。例如,如果s设置为“###snacktime”,则正确的值为3('s'的位置);此处发布的代码将返回 6('c' 的位置)。
    • 现在可以了吗?编码。同样的逻辑,OP 应该只是把它写在函数体中。
    • 否;同样的问题。您找到的是第一个“c”,而不是第一个字母。
    【解决方案3】:

    首先,尼克的回答是,我认为最好。但是正则表达式可能很难,而且我不擅长使用它们,所以我倾向于远离它们,因为它们在我手中非常脆弱。

    所以对于它的价值,这里有一个不使用正则表达式的简短方法:

    import string
    s = "##catgiraffeapluscompscI"
    letters_found = [L for L in string.ascii_letters if L in s]
    if letters_found:
        first_letter_position = min([s.find(L) for L in letters_found])
    else:
        first_letter_position = -1
    print(first_letter_position)
    

    基本上,它会列出目标中的所有字母(如果目标中没有,则为空);然后对于目标中存在的每个字母,找到第一个位置;并采取最小的那个。

    但是,如果您对正则表达式感到满意,Nick's 会更好。

    【讨论】:

      【解决方案4】:

      首先找到字母,然后找到它的索引。

      >>> s.find(next(filter(str.isalpha, s)))
      2
      

      【讨论】:

        【解决方案5】:

        您可以使用正则表达式搜索第一个字母(使用 re.I 标志的 a-z 或 A-Z),如果找到,则从匹配对象返回 start 值:

        import re
        
        def first_letter(s):
            m = re.search(r'[a-z]', s, re.I)
            if m is not None:
                return m.start()
            return -1
        
        s = "##catgiraffeapluscompscI"
        i = first_letter(s)
        print(i)
        

        输出:

        2
        

        【讨论】:

        • 在使用您的代码 Traceback 时出现此错误(最近一次调用最后一次):文件“main.py”,第 9 行,在 i = first_letter(s) 文件“main.py”,第 2 行,在 first_letter m = re.search(r'[az]', s, re.I) NameError: name 're' is not defined 
        • @JohnMaterum 刚刚意识到我的答案中的 import re 格式错误。您需要包含它以引入正则表达式 (re) 模块。查看我的编辑
        【解决方案6】:

        您可以将字符串视为字符列表,并对其进行迭代,直到找到匹配项。这个 while 语句检查字符,如果它不存在,它会阻止你掉出列表的末尾。

        s = "##catgiraffeapluscompscI"
        index = 0
        search_char = "c"
        
        while (index != len(s)) and (s[index] != search_char):
            index += 1
        
        if index == len(s):
            print("Character not in string")
        else:
            print("Character is at position: ", index)
        

        【讨论】:

          猜你喜欢
          • 2017-11-12
          • 2014-11-26
          • 2017-03-10
          • 1970-01-01
          • 2022-11-12
          • 2016-03-19
          • 2016-06-07
          • 2020-09-07
          • 1970-01-01
          相关资源
          最近更新 更多