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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1511閲覧

Python正規表現に関して

MAMOMIMOMU

総合スコア13

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2020/03/14 10:58

以下は、入力された文字列が大文字から始まり、小文字と数字を含み、かつ文字の長さ8以上かを判定する関数です。プログラムがあまり美しくないため、特に最初の大文字から始まるかの判定など、文字列の先頭を取ってきて正規表現を使っていますが、これ以外にもっと効率的な(大文字判定に限らず)書き方はありませんでしょうか?自分ならこう書くといったアイディアがありましたら、ぜひご教授ください。

python

1def strong_pw(string: str) -> str: 2 import re 3 re_starts_with_upper = re.compile(r'[A-Z]') 4 re_contains_alpha = re.compile(r'[a-z]+') 5 re_contains_num = re.compile(r'\d+') 6 if len(string) < 8: 7 return "パスワードが短すぎます。" 8 else: 9 mo_starts_with_upper = re_starts_with_upper.search(string[0]) 10 if mo_starts_with_upper == None: 11 return "パスワードは大文字から始めてください。" 12 mo_contains_alpha = re_contains_alpha.search(string) 13 if mo_contains_alpha == None: 14 return "パスワードは小文字も含むようにしてください。" 15 mo_contains_num = re_contains_num.search(string) 16 if mo_contains_num == None: 17 return "パスワードは数字を含むようにしてください。" 18 19 return "強度は十分です。"
s.k👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

基本的には失敗したらエラー文字列を返すif文の羅列で組みます。提示のコードではelseは不要です。
なお、提示の場合はすべて正規表現でチェックできるので以下のようなループで処理することもできます。

Python

1import re 2 3def strong_pw(string: str) -> str: 4 5 checks = [(re.compile(r'.{8,}'), "パスワードが短すぎます。"), 6 (re.compile(r'^[A-Z]'), "パスワードは大文字から始めてください。"), 7 (re.compile(r'[a-z]+'), "パスワードは小文字も含むようにしてください。"), 8 (re.compile(r'\d+'), "パスワードは数字を含むようにしてください。")] 9 10 for m,mes in checks: 11 if m.search(string) is None: 12 return mes 13 14 return "強度は十分です。" 15 16print( strong_pw('Aa1')) 17print( strong_pw('aA1*****')) 18print( strong_pw('AA1*****')) 19print( strong_pw('Aaa*****')) 20print( strong_pw('Aa1*****'))

投稿2020/03/14 12:07

編集2020/03/14 12:15
can110

総合スコア38262

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

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

MAMOMIMOMU

2020/03/23 06:35

回答ありがとうございました。 そのforループは思い浮かびませんでしたが、きれいなコードになりますね。 参考にさせていただきます!
guest

0

美しいかどうかは時代により変わりますのでなんとも言えませんが、立派なコードではないでしょうか。
分かりやすい(主旨が明確)ですし、メンテナンス性も良く、資源(CPUなど)の消費などこのコードでは関係ないのでこのままで良いのではと思います。
これではヨイショになるので、御提案を。

パスワードは大文字から始めてください。
パスワードは小文字も含むようにしてください。
パスワードは数字を含むようにしてください。

は、丁寧すぎるのでは。チェック内容があからさまに見えています。だめですの一言でいいのでは。

それから

強度は十分です。

は文言を変えましょう。だれも(神も仏も)十分とは言えないと思いますので。

投稿2020/03/14 11:50

ikapy

総合スコア1167

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

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

otn

2020/03/14 13:06

> チェック内容があからさまに見えています。 チェック内容が不明だと、どう変えたら通るのか不明で、ユーザーが困るのでは?
MAMOMIMOMU

2020/03/23 06:38

回答ありがとうございました。 ちょっと丁寧すぎるかもしれませんが、実際のサービスってこんな感じかなぁと思い浮かべて作ってみました!ちょっと冗長すぎたかもしれません...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問