Notes & software courses · Free to learn
Aph's Blog
On this page

Regular Expressions (regex)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

ค้นหา แยก ตรวจสอบ และแทนที่รูปแบบในข้อความด้วย regex — ทักษะที่เจอตลอดในงานจริง

regex (regular expression) คือ "ภาษาเล็ก ๆ" สำหรับอธิบายรูปแบบของข้อความ ใช้ค้นหา/ตรวจสอบ/ดึงข้อมูล เช่น หาอีเมลในข้อความ ตรวจรูปแบบเบอร์โทร แยกข้อมูลจาก log — เป็นทักษะปฏิบัติที่ใช้บ่อยมาก

โมดูล re และฟังก์ชันหลัก

python
import re

text = "ติดต่อ 081-234-5678 หรือ 02-111-2222"

# search: หาตัวแรกที่ match
m = re.search(r"\d{3}-\d{3}-\d{4}", text)
print(m.group())          # 081-234-5678

# findall: หาทั้งหมด คืน list
print(re.findall(r"\d+", text))   # ['081', '234', '5678', '02', '111', '2222']

# sub: แทนที่
print(re.sub(r"\d", "X", text))   # ติดต่อ XXX-XXX-XXXX หรือ ...

สัญลักษณ์พื้นฐานที่ต้องรู้

สัญลักษณ์หมายถึง
\dตัวเลข 0-9
\wตัวอักษร/ตัวเลข/_
\sช่องว่าง (space, tab, newline)
.ตัวอักษรอะไรก็ได้ 1 ตัว
* + ?ซ้ำ 0+ / 1+ / 0หรือ1 ครั้ง
{n}ซ้ำ n ครั้งพอดี
[abc]ตัวใดตัวหนึ่งในวงเล็บ
( )จับกลุ่ม (group)
|หรือ

group — ดึงส่วนที่ต้องการ

python
import re

log = "2026-06-01 ERROR เกิดข้อผิดพลาด"
m = re.search(r"(\d{4})-(\d{2})-(\d{2}) (\w+)", log)
if m:
    print(m.group(1))   # 2026  (กลุ่มที่ 1)
    print(m.group(4))   # ERROR
    print(m.groups())   # ('2026', '06', '01', 'ERROR')

ตัวอย่างใช้จริง: validate

python
import re

def is_valid_email(email):
    pattern = r"^[\w.]+@[\w.]+\.\w+$"
    return re.match(pattern, email) is not None

print(is_valid_email("aph@example.com"))   # True
print(is_valid_email("not-an-email"))      # False
regex ซับซ้อนอ่านยาก — ใช้ให้พอดี

regex ทรงพลังแต่ pattern ยาว ๆ อ่านยากมาก ใส่ comment อธิบายหรือใช้ re.VERBOSE แตกบรรทัด และอย่าใช้ regex parse HTML/JSON (ใช้ library เฉพาะดีกว่า) — ใช้ regex กับรูปแบบข้อความง่าย ๆ ที่ชัดเจน

สรุปหัวข้อนี้

  • re.search (ตัวแรก), re.findall (ทั้งหมด), re.sub (แทนที่), re.match (ตั้งแต่ต้น)
  • สัญลักษณ์หลัก: \d \w \s . * + ? {n} [ ] ( ) |
  • ( ) จับกลุ่ม ดึงด้วย .group(n) / .groups()
  • regex ซับซ้อนอ่านยาก — ใช้กับรูปแบบชัดเจน อย่า parse HTML
แบบฝึกหัด

1) ดึงตัวเลขทั้งหมดจากข้อความด้วย findall 2) เขียน regex validate เบอร์โทร 0xx-xxx-xxxx 3) ใช้ group ดึงปี-เดือน-วันจากวันที่ 4) ใช้ sub แทนที่ช่องว่างหลายตัวให้เหลือตัวเดียว