Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでパスワードが基準を満たしているか判定するプログラムの作り方

文字列 s が1つのパスワードを表しているとします。このパスワードが所定の基準を満たしているかどうかを判定する必要があります。チェックすべきルールは以下の通りです。

  • パスワードの長さは8文字以上20文字以下であること
  • 少なくとも1つの数字を含むこと
  • 少なくとも1つの小文字と1つの大文字を含むこと
  • !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ のような特殊文字を少なくとも1つ含むこと
  • タブや改行など、上記以外の文字を含まないこと

例えば、入力が "@bCd12#4" の場合、すべての条件を満たしているため、出力は True になります。

解決のアプローチ

この問題を解くために、以下の手順に従います。

  • カウンター変数 a, b, c, d をそれぞれ 0 で初期化する
  • パスワードの長さが8未満または20より大きい場合は False を返す
  • パスワード内の各文字 i について以下を判定する
    • i が大文字であれば a を +1
    • i が小文字であれば b を +1
    • i が特殊文字セット '"!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' に含まれる場合は c を +1
    • i が数字であれば d を +1
  • a・b・c・d がそれぞれ1以上であり、かつ a+b+c+d がパスワードの長さと一致する場合は True を返す
  • それ以外の場合は False を返す

最後の条件「a+b+c+d がパスワードの長さと一致する」は、タブや改行など許可されていない文字が混入していないことを確認するために重要です。もし不正な文字が含まれていれば、4種類のカウンターの合計が実際の長さに届かなくなります。

実装例

class Solution:
    def solve(self, password):
        a=0
        b=0
        c=0
        d=0
        if len(password)<8 or len(password)>20:
            return False
        for i in password:
            if i.isupper():
                a+=1
            elif i.islower():
                b+=1
            elif i in '"!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~"':
                c+=1
            elif i.isdigit():
                d+=1
        if a>=1 and b>=1 and c>=1 and d>=1 and a+b+c+d==len(password):
            return True
        else:
            return False
s = "@bCd12#4"
ob = Solution()
print(ob.solve(s))

入力

"@bCd12#4"

出力

True

補足:正規表現を使った別の方法

同様の判定は Python の re モジュール(正規表現)を使っても実装できます。各条件を個別のパターンで確認する方法です。

import re

def validate_password(password):
    if not (8 <= len(password) <= 20):
        return False
    if not re.search(r'[0-9]', password):
        return False
    if not re.search(r'[a-z]', password):
        return False
    if not re.search(r'[A-Z]', password):
        return False
    if not re.search(r'[!"#$%&\'()*+,\-./:;<=>?@\[\\\]^_`{|}~]', password):
        return False
    if re.search(r'[^0-9a-zA-Z!"#$%&\'()*+,\-./:;<=>?@\[\\\]^_`{|}~]', password):
        return False
    return True

このアプローチでは、許可されていない文字(タブや改行など)が含まれている場合も最後のチェックで検出できます。状況に応じて、カウンター方式と正規表現方式を使い分けるとよいでしょう。

  1. Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム

    2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または

  2. 指定された文字列がキーワードであるかどうかを確認するPythonプログラム

    この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ