Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมตรวจสอบหมายเลขบัตรเครดิตว่าถูกต้องหรือไม่ใน Python

การตรวจสอบความถูกต้องของหมายเลขบัตรเครดิต

เงื่อนไขบัตรเครดิตที่ถูกต้อง:

  • ขึ้นต้นด้วย 4, 5, หรือ 6
  • ยาว 16 หลัก
  • ประกอบด้วยตัวเลขเท่านั้น
  • อาจมีเครื่องหมาย - แยกเป็น 4 กลุ่ม กลุ่มละ 4 หลัก
  • ไม่มีตัวคั่นอื่น (space, underscore)
  • ไม่มีเลขซ้ำ 4 ตัวติดกัน

อัลกอริทึม

  1. ถ้ามี '-': แยกกลุ่ม ตรวจสอบ 4 กลุ่ม กลุ่มละ 4 หลัก
  2. ลบ '-' ออก
  3. ตรวจสอบ regex: เริ่ม 4/5/6 ตามด้วย 15 หลัก
  4. ตรวจสอบ regex: ไม่มี 4 ตัวติดกันเหมือนกัน

ตัวอย่างโค้ด

import re

def solve(s):
    if s.count("-") > 0:
        a = s.split("-")
        p = 1
        if len(a) != 4:
            p = None
            a = []
        for b in a:
            if len(b) != 4:
                p = None
                break
    else:
        p = re.search("[456][0-9]{15}", s)
    s = s.replace("-", "")
    q = re.search(r".*([0-9])\1{3}.*", s)
    if p is not None and q is None:
        return True
    else:
        return False

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

ผลลัพธ์

False

คำอธิบาย

"5423-2578-8632-6589" ผ่านเงื่อนไขรูปแบบ แต่ผลลัพธ์ False อาจเพราะ regex p ไม่ตรง (ต้องตรงทั้งสตริง ไม่ใช่ substring) ควรใช้ ^[456][0-9]{15}$

โค้ดที่แก้ไข:

import re

def solve(s):
    # ตรวจสอบรูปแบบพื้นฐาน
    if '-' in s:
        parts = s.split('-')
        if len(parts) != 4 or any(len(p) != 4 for p in parts):
            return False
    s_clean = s.replace('-', '')
    if not re.fullmatch(r'[456]\d{15}', s_clean):
        return False
    if re.search(r'(\d)\1{3}', s_clean):
        return False
    return True

print(solve("5423-2578-8632-6589"))  # True