質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

827閲覧

passwordで大文字小文字数字があるかどうか確認するコード

khayato0512

総合スコア24

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/08/20 20:20

前提・実現したいこと

pythonでユーザーがパスワードを入力する際に最低10文字以上であること、大文字小文字数字を含んでいるかを確認するコードを作ろうとしているのですが、思い通りになりません。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1def checkio(password): 2 upp = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] 3 low = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"] 4 digit =[1,2,3,4,5,6,7,8,9,0] 5 up = False 6 lo = False 7 dig = False 8 if len(password)>=10: 9 10 for letter in password: 11 12 13 if letter in upp: 14 up =True 15 if letter in low : 16 lo = True 17 if letter in digit: 18 dig =True 19 if (up == True) and (lo == True) and (dig == True): 20 return True 21 return False 22print(checkio("aallllllllfjh1G"))

試したこと

このケースで、10文字以上で大文字小文字数字を含んでいるのでTrueを出したいのですがFalseになってしまいます。どこか見落としているところがありましたらご指摘お願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

参考情報

  • 数字・英字小文字・英字大文字が含まれているかをチェックする関数を作成

https://remotestance.com/blog/2773/

投稿2019/08/23 22:27

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

数字文字かの判定においてdigit=[1,2,...のように文字ではなく数値のリストを用いているのがうまくいかない原因です。該当文字かを判定するには正規表現を用いると少し簡潔に書けます。

Python

1import re 2 3def checkio(s): 4 if len(s) < 10: 5 return False 6 7 is_match = [0,0,0] # 大文字、小文字、数字なら各要素に1をセット 8 for c in s: 9 if re.match(r'[A-Z]',c): 10 is_match[0] = 1 11 elif re.match(r'[a-z]',c): 12 is_match[1] = 1 13 elif re.match(r'[0-9]',c): 14 is_match[2] = 1 15 # もし「上記のみで構成される」という制約をつけたいなら、以下のコメント部分を生かす 16 #else: 17 # return False # それ以外はだめ 18 19 return sum(is_match) == 3 # すべてを含む 20 21for s in ['1aA', '1aA2234567-','1aA22345678', '1aA2345678']: 22 print(s, checkio(s))

なお、pythonのis系関数は全角もTrueと判定するので注意が必要です。

Python

1print('1'.isdigit()) # True! 2print('A'.isupper()) # True!

投稿2019/08/20 22:50

編集2019/08/20 22:54
can110

総合スコア38258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/20 23:58

正規表現なら一行で書ける気が。
can110

2019/08/21 00:06

なんだか面倒そうな表現になりそうなので妥協しました…
khayato0512

2019/08/22 20:43

回答ありがとうございます! 正規表現をというモジュールを知らなかったのでとても勉強になりました! もう一つ質問したいことがあります。 if re.match(r'[A-Z]',c): is_match[0] = 1 elif re.match(r'[a-z]',c): is_match[1] = 1 elif re.match(r'[0-9]',c): is_match[2] = 1 この部分で、if,elif.elifと続いているところをif,if,ifではダメな理由を知りたいです。 すごく初歩的な質問ですみません!よろしくお願いします。
can110

2019/08/22 22:14

ダメではないですが無駄だからです。 たとえばもし英大文字なら小文字や数字でないことは明らかなので後続のif判定をする必要がないです。
khayato0512

2019/08/23 12:31

なるほど!!ありがとうございます!!elifにすればそこを通さずに済むのですね!納得しました。 それは納得したのですが、if,if,ifにしたらTrueを出したいケースでFalseが出てしまいます、これはifだとムダだからという理由のほかに何かそれだとうまくいかない原因があると思うのですが、なぜ違う結果が出てしまうのですか? ありがとうございます。
can110

2019/08/24 00:06

実際のコードとFalseが出てしまう具体的なケースが不明なので何ともいえませんが 3つの条件は互いに排他なので理屈ではif,if,ifでも同じ判定結果になるはずです。
khayato0512

2019/08/31 20:00

丁寧なご回答感謝しています。ありがとうございます!!
guest

0

以下のようにして、分岐条件を確認すると良いです。

python

1if letter in upp: 2 print("upp") 3 up =True 4if letter in low : 5 print("low") 6 lo = True 7if letter in digit: 8 print("dig") 9 dig =True

同じ型で比較してあげると良いですよ。

投稿2019/08/20 21:51

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

khayato0512

2019/08/22 20:27

回答ありがとうございます。 if文にprint()を入れるのはなぜですか? ありがとうございます、よろしくお願いします!
退会済みユーザー

退会済みユーザー

2019/08/22 21:27

手を動かせば分かります。
guest

0

isupper、islower という関数があります

投稿2019/08/20 21:13

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問