โจทย์: รับ IP Address ที่อาจมี Leading Zeros (ศูนย์นำหน้า) เช่น 255.001.040.001 ให้แปลงเป็นรูปแบบมาตรฐาน 255.1.40.1
วิธีการแก้ปัญหา
- แยกสตริงด้วย
split('.')เป็น 4 ส่วน (Octets) - แปลงแต่ละส่วนเป็น
int(จะตัด Leading Zeros อัตโนมัติ) - แปลงกลับเป็น
str - รวมกลับด้วย
join('.')
ตัวอย่างโค้ด
def remove_leading_zeros_ip(ip_address):
"""ลบ Leading Zeros จาก IP Address"""
# แยกตาม '.'
parts = ip_address.split('.')
# ตรวจสอบรูปแบบ IP (ควรมี 4 ส่วน)
if len(parts) != 4:
raise ValueError("Invalid IP address format")
# แปลงแต่ละส่วนเป็น int แล้วกลับเป็น str
cleaned_parts = [str(int(part)) for part in parts]
# รวมกลับ
return '.'.join(cleaned_parts)
# ทดสอบ
test_ips = [
"255.001.040.001",
"192.168.001.001",
"10.0.0.1",
"001.002.003.004",
"127.0.0.1"
]
for ip in test_ips:
print(f"{ip:>18} -> {remove_leading_zeros_ip(ip)}")
ผลลัพธ์
255.001.040.001 -> 255.1.40.1
192.168.001.001 -> 192.168.1.1
10.0.0.1 -> 10.0.0.1
001.002.003.004 -> 1.2.3.4
127.0.0.1 -> 127.0.0.1
การจัดการข้อผิดพลาด (Error Handling)
def remove_leading_zeros_ip_safe(ip_address):
try:
parts = ip_address.split('.')
if len(parts) != 4:
raise ValueError("IP ต้องมี 4 ส่วน (Octets)")
cleaned = []
for part in parts:
if not part.isdigit():
raise ValueError(f"ส่วน '{part'} ไม่ใช่ตัวเลข")
num = int(part)
if num < 0 or num > 255:
raise ValueError(f"ค่า {num} อยู่นอกช่วง 0-255")
cleaned.append(str(num))
return '.'.join(cleaned)
except ValueError as e:
return f"Error: {e}"
# ทดสอบ Error Cases
invalid_ips = [
"255.001.040", # ไม่ครบ 4 ส่วน
"255.001.040.001.002", # มากกว่า 4 ส่วน
"255.abc.040.001", # มีตัวอักษร
"255.001.256.001", # ค่ามากกว่า 255
"255..040.001", # ส่วนว่าง
]
for ip in invalid_ips:
print(f"{ip:>20} -> {remove_leading_zeros_ip_safe(ip)}")
ผลลัพธ์ Error Cases
255.001.040 -> Error: IP ต้องมี 4 ส่วน (Octets)
255.001.040.001.002 -> Error: IP ต้องมี 4 ส่วน (Octets)
255.abc.040.001 -> Error: ส่วน 'abc' ไม่ใช่ตัวเลข
255.001.256.001 -> Error: ค่า 256 อยู่นอกช่วง 0-255
255..040.001 -> Error: ส่วน '' ไม่ใช่ตัวเลข
วิธีทางเลือก: ใช้ Regex (Regular Expression)
import re
def remove_leading_zeros_regex(ip):
# แทนที่ 0+ ตามด้วยตัวเลข ด้วยแค่ตัวเลข (แต่ไม่แทนที่ 0 เดี่ยว)
return re.sub(r'\b0+(\d)', r'\1', ip)
# ทดสอบ
print(remove_leading_zeros_regex("255.001.040.001")) # 255.1.40.1
print(remove_leading_zeros_regex("0.0.0.0")) # 0.0.0.0 (คงเดิม)
สรุป
- วิธีแปลงเป็น int: เรียบง่าย ที่สุด เข้าใจง่าย จัดการ Error ได้ดี
- Regex: เร็วสำหรับ Bulk Processing แต่ซับซ้อนกว่า
- ควร Validate IP Format ก่อนประมวลผลใน Production Code