Khi cần tìm một mẫu chuỗi phức tạp — email, số điện thoại, mã đơn hàng — vòng lặp và if sẽ rất dài dòng. Regex (biểu thức chính quy) giải quyết việc đó trong một dòng.
Bốn hàm cần nhớ
import re
van_ban = "Liên hệ: [email protected] hoặc [email protected]"
re.search(r"\w+@\w+\.\w+", van_ban) # tìm kết quả đầu tiên
re.findall(r"\w+@[\w.]+", van_ban) # lấy tất cả -> list
re.sub(r"\w+@[\w.]+", "[ẩn]", van_ban) # thay thế
re.split(r"[,;]\s*", "a, b; c") # tách chuỗi
Các ký hiệu thường dùng
\dchữ số,\wchữ cái/số/gạch dưới,\skhoảng trắng+một hoặc nhiều,*không hoặc nhiều,?có hoặc không^đầu chuỗi,$cuối chuỗi[abc]một trong các ký tự,{2,4}lặp từ 2 đến 4 lần
Nhóm bắt: lấy ra từng phần
ngay = "15/08/2026"
m = re.match(r"(\d{2})/(\d{2})/(\d{4})", ngay)
print(m.group(1), m.group(2), m.group(3)) # 15 08 2026
# Đặt tên nhóm cho dễ đọc
m = re.match(r"(?P<ngay>\d{2})/(?P<thang>\d{2})/(?P<nam>\d{4})", ngay)
print(m.group("thang")) # 08
Luôn dùng chuỗi raw
Viết r"\d+" thay vì "\d+". Tiền tố r báo Python đừng diễn giải dấu gạch chéo ngược, tránh lỗi khó tìm.
Biên dịch trước nếu dùng nhiều lần
mau_email = re.compile(r"[\w.]+@[\w.]+\.\w+")
for dong in danh_sach:
if mau_email.search(dong):
print(dong)
Khi nào đừng dùng regex
Regex mạnh nhưng khó đọc. Với việc đơn giản, các phương thức chuỗi vẫn tốt hơn: "abc".startswith("a") rõ ràng hơn re.match(r"^a", "abc"). Và tuyệt đối đừng phân tích HTML bằng regex — hãy dùng Beautiful Soup.
Mẹo học nhanh: dán mẫu của bạn lên regex101.com để xem từng ký hiệu khớp vào đâu trước khi đưa vào code.
