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

Python: ลบ Leading Zeros ออกจาก IP Address

โจทย์: รับ IP Address ที่อาจมี Leading Zeros (ศูนย์นำหน้า) เช่น 255.001.040.001 ให้แปลงเป็นรูปแบบมาตรฐาน 255.1.40.1

วิธีการแก้ปัญหา

  1. แยกสตริงด้วย split('.') เป็น 4 ส่วน (Octets)
  2. แปลงแต่ละส่วนเป็น int (จะตัด Leading Zeros อัตโนมัติ)
  3. แปลงกลับเป็น str
  4. รวมกลับด้วย 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