2016-04-05 3 views
1

私は、与えられた文字列がアルファベットのすべての文字を含むpangramであるかどうかをチェックするPythonプログラムを書こうとしています。Pythonで文字列にアルファベットの文字がすべて含まれているかどうかを確認するにはどうすればよいですか?

したがって、"We promptly judged antique ivory buckles for the next prize"は、Trueを返す必要がありますが、アルファベットの各文字を少なくとも1回は含まない文字列は、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

コードワールでこのkataが好きです。 [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

あなたは正規表現を必要といけません。あなたが望むのは、2行で、効率的なスペースで行えます。

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

これだけです。 は確認したい文字列です。 flagは、すべての文字がstringにあるかどうかによって、TrueまたはFalseのいずれかになります。

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(N、STR)のチェックを、nが文字列である場合。関数set()は私たちに集合を与えます。たとえばset( 'penny')は、{'y'、 'e'、 'p'、 'n'}を返します。

+0

これは不正な解決方法です。たとえば、26個の疑問符文字で構成される文字列がパングラムであると報告します。パングラムは少なくとも26文字で構成する必要がありますが、26文字のすべての文字列がパングラムではありません。 –

+0

@StephenCスクリプトを編集しましたが、今すぐ動作するはずです。 –

+0

はい。これは基本的に受け入れられたソリューションと同じです。 –

0

今日は同じ運動をしていましたが、おそらくそれは最善の方法ではないかもしれませんが、理解しやすいと思います。

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

関連する問題