2016-04-05 6 views
1

Я пытаюсь написать программу python, которая проверяет, является ли данная строка pangram - содержит все буквы алфавита.Как проверить, содержит ли строка ВСЕ буквы алфавита в python?

Поэтому "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 
+3

Не каждая проблема форматирования строк является проблемой регулярных выражений. – Chris

+0

Так же, как этот ката в кодоводах. [detect-panagram] (https://www.codewars.com/kata/detect-pangram/train/python) – azzamsa

ответ

7

Это не то, что я бы решил с регулярным выражением, нет. Создание набора в нижнем регистре строки и проверить, если он является надстройкой из букв алфавита:

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 
+0

Будет ли это работать, если строка содержит более одного экземпляра письма? – Maslor

+0

@Maslor: да. Вы не указали, требует ли ваш тест, чтобы буквы отображались только один раз. –

+0

Это решение моей проблемы. Спасибо! Я приму свой ответ, как только смогу. – Maslor

0

Вам не нужно регулярное выражение. То, что вы хотите, можно сделать в двух линиях с хорошей эффективностью пространства.

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 будет либо True, либо False в зависимости от того, все ли символы в string или нет.

0

Панграма - это функция, которая содержит по крайней мере каждую букву алфавита. Я попытался таким образом:

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 (п, ул) проверяет, если п является строкой. Функция set() дает нам множество. Например, set ('penny') возвращает {'y', 'e', ​​'p', 'n'} ..., как вы видите, это набор без повторных букв.

+0

Это неправильное решение. Например, он сообщит, что строка, состоящая из 26 символов вопросительного знака, представляет собой панграмму. Хотя панграма должна состоять не менее чем из 26 символов, не все строки из 26 символов являются панграмами. –

+0

@StephenC Я отредактировал сценарий, теперь он должен работать. –

+0

Ну да. Теперь это по существу то же самое, что и принятое решение. –

0

Сегодня я делал одно и то же упражнение, возможно, это не самый лучший aproach, но я думаю, что это легко понять.

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 :(") 
+1

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. – rollstuhlfahrer

+0

@rollstuhlfahrer Спасибо за комментарий, это первый раз, когда я отправляю что-то в stackoverflow, не могли бы вы помочь мне понять, что может быть «контекстом относительно того, почему и/или как этот код отвечает на вопрос». Еще раз спасибо. – mseromenho

Смежные вопросы