การตรวจสอบความถูกต้องของหมายเลขบัตรเครดิต
เงื่อนไขบัตรเครดิตที่ถูกต้อง:
- ขึ้นต้นด้วย 4, 5, หรือ 6
- ยาว 16 หลัก
- ประกอบด้วยตัวเลขเท่านั้น
- อาจมีเครื่องหมาย - แยกเป็น 4 กลุ่ม กลุ่มละ 4 หลัก
- ไม่มีตัวคั่นอื่น (space, underscore)
- ไม่มีเลขซ้ำ 4 ตัวติดกัน
อัลกอริทึม
- ถ้ามี '-': แยกกลุ่ม ตรวจสอบ 4 กลุ่ม กลุ่มละ 4 หลัก
- ลบ '-' ออก
- ตรวจสอบ regex: เริ่ม 4/5/6 ตามด้วย 15 หลัก
- ตรวจสอบ 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