บทความนี้สาธิตวิธีเรียงลำดับลิสต์ของสตริงโดยใช้ตัวเลขที่อยู่ภายในสตริงเป็นเกณฑ์การเรียง โดยใช้ Regular Expression (Regex)
โค้ดตัวอย่าง
import re
def extract_first_number(text):
"""ดึงตัวเลขตัวแรกที่พบในสตริง"""
match = re.search(r'\d+', text)
return int(match.group()) if match else 0
# หรือใช้ findall แบบเดิม
def extract_numbers(text):
"""ดึงตัวเลขทั้งหมดในสตริง"""
return list(map(int, re.findall(r'\d+', text)))
# ข้อมูลทดสอบ
my_list = ['pyt23hon', 'fu30n', 'lea14rn', 'co00l', 'ob8uje3345t']
print("ลิสต์ต้นฉบับ:")
print(my_list)
# เรียงโดยใช้ตัวเลขตัวแรกเป็น Key
my_list.sort(key=extract_first_number)
print("\nลิสต์หลังเรียงตามตัวเลขตัวแรก:")
print(my_list)
ผลลัพธ์
ลิสต์ต้นฉบับ:
['pyt23hon', 'fu30n', 'lea14rn', 'co00l', 'ob8uje3345t']
ลิสต์หลังเรียงตามตัวเลขตัวแรก:
['co00l', 'ob8uje3345t', 'lea14rn', 'pyt23hon', 'fu30n']
# 00 8 14 23 30
อธิบาย Regex Pattern
\d+= ตัวเลข 1 หลักขึ้นไปre.findall()หาตัวเลขทั้งหมดในสตริงre.search()หาตัวเลขตัวแรกที่เจอ (เร็วกว่า)
กรณีพิเศษ: ตัวเลขนำหน้าด้วยศูนย์ (Leading Zeros)
# 'co00l' → พบ '00' → int('00') = 0
# 'ob8uje3345t' → พบ '8' → int('8') = 8
# เรียงได้ถูกต้องเพราะแปลงเป็น int แล้ว
การประยุกต์ใช้
- เรียงไฟล์:
file1.txt, file2.txt, file10.txt→ เรียงเป็น 1, 2, 10 (Natural Sort) - จัดลำดับรหัสสินค้า:
PROD-001, PROD-010, PROD-002 - ประมวลผล Log ที่มี Timestamp/ID อยู่ในข้อความ
Natural Sort แบบสมบูรณ์ (แนะนำ)
import re
def natural_sort_key(text):
"""Key สำหรับ Natural Sort - แยกตัวเลขและตัวอักษร"""
return [int(c) if c.isdigit() else c.lower() for c in re.split(r'(\d+)', text)]
files = ['file1.txt', 'file10.txt', 'file2.txt', 'File20.txt']
files.sort(key=natural_sort_key)
print(files) # ['file1.txt', 'file2.txt', 'file10.txt', 'File20.txt']