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

Pythonでクレジットカード番号の有効性をチェックする方法

クレジットカード番号が与えられたとき、その番号が有効かどうかを判定するPythonプログラムを作成してみましょう。有効なカード番号とみなされるには、以下の条件をすべて満たしている必要があります。

  • 先頭は4、5、6のいずれかで始まる
  • 全体で16桁である
  • 数字のみで構成されている
  • 数字を4桁ずつ4つのグループに分け、「-(ハイフン)」で区切ってもよい
  • スペースやアンダースコアなど、ハイフン以外の区切り文字は使用できない
  • 同じ数字が4桁以上連続してはならない

たとえば、入力が s = "5423-2578-8632-6589" の場合を考えてみます。この番号は先頭が5で始まり、合計16桁、4桁×4グループがハイフンで区切られており、同じ数字の連続もないため、有効と判定されて出力は True になります。

解決のための考え方

  1. 文字列に「-」が含まれる場合は、まず「-」で分割し、グループ数が4つ、かつ各グループがちょうど4桁であることを確認します。
  2. 「-」をすべて取り除いた文字列に対し、正規表現で「先頭が4・5・6のいずれかで、残り15桁が数字」というパターンに一致するかを検証します。
  3. 同様に正規表現で、同じ数字が4回以上連続する箇所が存在しないかを調べます。
  4. 形式チェックに合格し、連続する同じ数字がなければ True を返し、それ以外は False を返します。

実装例

それでは、実際のPythonコードを見てみましょう。

import re

def solve(s):
# ハイフン区切りの形式チェック
if s.count("-") > 0:
parts = s.split("-")
if len(parts) != 4 or any(len(part) != 4 for part in parts):
return False

# ハイフンを除去してから検証する
s = s.replace("-", "")

# 先頭が4・5・6で始まる16桁の数字かどうか
p = re.fullmatch(r"[456][0-9]{15}", s)

# 同じ数字が4回以上連続していないか
q = re.search(r"([0-9])\1{3}", s)

return p is not None and q is None

s = "5423-2578-8632-6589"
print(solve(s))

入力

"5423-2578-8632-6589"

出力

True

コードのポイント

  • re.fullmatch(r"[456][0-9]{15}", s):文字列全体が「4・5・6のいずれか1桁+数字15桁」、つまり合計16桁の数字列であることを厳密にチェックします。
  • re.search(r"([0-9])\1{3}", s):後方参照(\1)を利用して、同じ数字が4回連続するパターンを検出します。
  • ハイフンは区切り文字としてのみ許容されるため、検証の前に必ず取り除くのがポイントです。

無効な番号の例

  • "4253-2678-8632-65893″ … 合計17桁あるため無効
  • "5120-2222-3333-4444″ … 同じ数字が4回連続しているため無効
  • "4120 2222 3333 4444″ … スペース区切りは許されないため無効

なお、実際の決済システムでは、こうした形式チェックに加えてLuhnアルゴリズム(モジュラス10法)によるチェックデジットの検証も行われます。本記事のプログラムは、あくまで番号の「形式的な妥当性」を判定するものだと理解しておきましょう。

  1. Pythonで素数を判定するプログラムの書き方を徹底解説

    はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない

  2. Pythonでアームストロング数を判定するプログラムの書き方

    この記事では、与えられた整数が「アームストロング数(Armstrong number)」であるかどうかを判定するための考え方と、Pythonによる具体的な実装方法を解説します。 問題の定義 整数 n が与えられたとき、その整数がアームストロング数であるかどうかを判定することを目標とします。 アームストロング数とは? n 桁の正の整数 abcd… が次の条件を満たすとき、この数は「n 次(オーダー n)のアームストロング数」と呼ばれます。 abcd... = a^n + b^n + c^n + d^n + … つまり、各桁の数字を「桁数乗」した値の総和が、元の数と一致するかを確認す