【问题标题】:How do I check if a string contains ALL letters of the alphabet in python?如何检查字符串是否包含python中的所有字母?
【发布时间】:2016-04-05 12:54:28
【问题描述】:

我正在尝试编写一个 python 程序来检查给定字符串是否为pangram - 包含字母表中的所有字母。

因此,"We promptly judged antique ivory buckles for the next prize" 应返回 True,而任何不包含至少一次字母表的每个字母的字符串都应返回 False

我相信我应该为此使用 RegEx,但我不确定如何。它应该看起来像这样:

import sys
import re

input_string_array = sys.stdin.readlines()
input_string = input_string_array[0]

if (re.search('string contains every letter of the alphabet',input_string):
    return True
else:
    return False

【问题讨论】:

  • 并非每个字符串格式问题都是正则表达式问题。
  • 就像 codewars 中的这个 kata。 detect-panagram

标签: python string pangram


【解决方案1】:

这不是我用正则表达式解决的问题,不。创建一组小写字符串并检查它是否是字母表的超集:

import string

alphabet = set(string.ascii_lowercase)

def ispangram(input_string):
    return set(input_string.lower()) >= alphabet

只有当字母表中的每个字母都在从输入文本创建的集合中时,它才会是超集;通过使用超集而不是相等,除了 (ASCII) 字母之外,您还允许使用标点符号、数字和空格。

演示:

>>> import string
>>> alphabet = set(string.ascii_lowercase)
>>> input_string = 'We promptly judged antique ivory buckles for the next prize'
>>> set(input_string.lower()) >= alphabet
True
>>> set(input_string[:15].lower()) >= alphabet
False

【讨论】:

  • 如果字符串有多个字母实例,这会起作用吗?
  • @Maslor:是的。您没有指定您的测试是否要求字母只出现一次。
  • 这确实解决了我的问题。谢谢!我会尽快接受你的回答。
【解决方案2】:

这是我在 python 中的解决方案:

alphabet = "abcdefghijklmnopqrstuvwxyz"
sentence = input()
sentence = sentence.lower()
missing = ''
for letter in alphabet:
  if letter not in sentence:
    missing = missing+letter
if (len(missing) != 0):
  print("missing", missing)
else:
  print("pangram")

【讨论】:

    【解决方案3】:

    你不需要正则表达式。 两行即可完成您想要的工作,空间效率高。

    ms = itertools.chain(range(ord("a"),ord("z")),range(ord("A"),ord("Z")))
    flag = all(chr(o) in string for o in ms)
    

    就是这样。 string 是您要检查的字符串。 flag 将是 TrueFalse 取决于是否所有字符都在 string 中。

    【讨论】:

      【解决方案4】:

      pangram 是一个函数,它至少包含字母表中的每个字母。 我试过这样:

      def pangram():
      n = str(input('give me a word to check if it is a pangram:\n'))
      n = n.lower()
      n = n.replace(' ','')
      if not isinstance(n, str):
          return n, False
      elif set(n) >= set('abcdefghijklmnopqrstuvxywz'):
          return n, True
      else: 
          return n, False
      

      函数 isinstance(n, str) 检查 n 是否为字符串。函数 set() 给了我们一个集合。例如 set('penny') 返回 {'y', 'e', 'p', 'n'}... 如您所见,它是一个没有重复字母的集合。

      【讨论】:

      • 这是一个错误的解决方案。例如,它将报告由 26 个问号字符组成的字符串是一个 pangram。虽然 pangram 必须至少包含 26 个字符,但并非所有 26 个字符的字符串都是 pangram。
      • @StephenC 我已经编辑了脚本,现在应该可以使用了。
      • 嗯,是的。现在它与公认的解决方案基本相同。
      【解决方案5】:

      我今天也在做同样的练习,也许这不是最好的方法,但我认为它很容易理解。

      def ispangram(s):
        stringy = ''
        flag = True
        validLetters = "abcdefghijklmnopqrstuvwxyz"
      
        #transform the given string in simple string with no symbols only letters
        for char in s.lower():
          if(char in validLetters):
            stringy += char
      
        #check if all the letters of the alphabet exist on the string
        for char in validLetters:
          if(char in stringy):
            pass
          else:
            flag = False
            break
      
        return flag
      
      if(ispangram("We promptly judged antique ivory buckles for the next prize")):
        print("It's PANGRAM!")
      else:
        print("It's not Pangram :(")
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      • @rollstuhlfahrer 感谢您的评论,这是我第一次在 stackoverflow 中实际发布内容,您能否帮助我理解“关于此代码为何和/或如何回答问题的上下文”。再次感谢。
      【解决方案6】:
      import string
      
      def ispangram(str1, alphabet=string.ascii_lowercase):
          return ''.join(sorted(set(str1.lower().replace(" ","")))) == alphabet
      

      首先将所有字母更改为小写,然后使用替换删除所有空格。然后转换为具有唯一字符的集合,然后使用 sorted 函数按字母顺序排序。由于 sorted 函数给出了一个列表,所以 join func 以不带空格加入它,然后将其与所有小写字符进行比较。

      【讨论】:

        【解决方案7】:

        这是我的解决方案:

        def isaPangrams(s):
            alph = list(string.ascii_lowercase)
            s = s.lower()
            s = list(s)
        
            for letter in alph:
                if letter not in s:
                    print('not pangram')
                    present='false'
                    break
                if letter in s:
                    present = 'true'
        
            if present == 'true':
                print('pangram')
        
        if __name__ == '__main__':
            s = input()
            answer = isaPangrams(s)
        

        【讨论】:

        • 欢迎来到 SO。请注意,在 python 中,约定是使用snake_case 作为函数名。 “isaPangrams”与该约定冲突
        猜你喜欢
        • 2017-01-08
        • 2018-04-18
        • 2020-12-12
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 2012-02-22
        相关资源
        最近更新 更多