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

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

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

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

Q&A

解決済

2回答

1990閲覧

【Python】パスワード判定関数を少ないコード量で記述する方法

_ryu_

総合スコア14

Python 3.x

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

0グッド

0クリップ

投稿2020/05/06 06:54

編集2020/05/06 06:57

Python

1import re 2def isValidPassword(password): 3 word_count = len(password) 4 lowercase = password.lower() 5 remove_num = password.replace('1', '').replace('2', '').replace('3', '').replace('4', '').replace('5', '').replace('6', '').replace('7','').replace('8', '').replace('9','').replace('0','') 6 if ' ' not in password and word_count >= 6 and lowercase != password and remove_num != password: 7 return True 8 else: 9 return False 10 11print(isValidPassword('1234567')) 12print(isValidPassword('Abc4eFg')) 13print(isValidPassword("Abc4 eFg")) 14 15re.sub('[0-9]+', '', password) ← この記述法は試しました。

上記コードよりコード量が少ない記述法をご教授ください。
できれば正規表現以外でお願いします。
また、Pythonの文字列置換はreplace()でコツコツやるしかないのでしょうか?

条件は下記の通りです。
・文字列が6以上
・大文字と小文字を含む・
・数字を含む
・スペースがない

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

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

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

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

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

guest

回答2

0

Python

1s = # パスワード(str型) 2if s.isalnum() and len(s) >= 6: 3 if not s.isdigit() and not str.isalpha() and not str.isupper() and not str.islower(): 4 # OK

こんな感じですか?
参考1
参考2

投稿2020/05/06 07:47

ForestSeo

総合スコア2720

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

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

_ryu_

2020/05/06 08:16

回答ありがとうございます。参考サイト教えて頂いて、より知識が増えるきっかけをもらえました。ありがとうございます。
ForestSeo

2020/05/06 08:25

それはよかったです
guest

0

ベストアンサー

提示されたコードだと、'ABC123'のようなケースのチェックが抜けていますよ。

自分で書くとしたら下記のf1みたいな感じで条件をベタに並べると思います。
正規表現の方が短かくできそうだけど、デバッグしづらいですよね。

python

1import re 2 3def isValidPassword(password): 4 word_count = len(password) 5 lowercase = password.lower() 6 remove_num = password.replace('1', '').replace('2', '').replace('3', '').replace('4', '').replace('5', '').replace('6', '').replace('7','').replace('8', '').replace('9','').replace('0','') 7 if ' ' not in password and word_count >= 6 and lowercase != password and remove_num != password: 8 return True 9 else: 10 return False 11 12def f1(s): 13 return len(s) >= 6 and any(map(str.isupper, s)) and any(map(str.islower, s)) and \ 14 any(map(str.isdigit, s)) and ' ' not in s 15 16def f2(s): 17 return bool(re.match(r'^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[^ ]{6,}$', s)) 18 19data = ['1234567', 'Abc4eFg', 'Abc4 eFg', 'Abc4eFg', '!@#$%^&*(', '!(*#1Aa', 'Aa132', 'ABC123', 20 'Aa1????????????', 'Aa02412512', 'zZ9sdfds', 'ABCabc', 'abc123'] 21for d in data: 22 print(f'{d}: {isValidPassword(d)} {f1(d)} {f2(d)}')

投稿2020/05/06 07:30

編集2020/05/06 07:53
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

_ryu_

2020/05/06 08:14

回答ありがとうございます。様々なパターン提示してくださりとても勉強になります。自分の引き出しが増えました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問