Trong Character Class [...], dùng dấu gạch ngang - để định nghĩa khoảng ký tự (range).
Cú pháp cơ bản
[a-z]: Tất cả chữ cái thường a-z.[A-Z]: Tất cả chữ cái hoa A-Z.[0-9]: Tất cả chữ số 0-9.[a-zA-Z0-9]: Alphanumeric (tương đương\wkhông underscore).
Ví dụ
import re
# Chữ cái thường
print(re.findall(r'[a-c]', 'abcdef')) # ['a', 'b', 'c']
# Chữ cái hoa
print(re.findall(r'[A-C]', 'ABCDEF')) # ['A', 'B', 'C']
# Số 2 chữ số từ 00-59 (phút/giây)
print(re.findall(r'[0-5][0-9]', '00 30 59 60 99')) # ['00', '30', '59']
# Kết hợp nhiều range
print(re.findall(r'[a-zA-Z0-9_]', 'a_Z-9')) # ['a', '_', 'Z', '9']
Escape dấu gạch ngang
Nếu muốn khớp ký tự - thực tế trong class:
- Đặt ở đầu:
[-a-z] - Đặt ở cuối:
[a-z-] - Escape:
[a\-z](khớp 'a', '-', 'z')
Lưu ý về Unicode
[a-z]chỉ khớp ASCII (mặc định Python 3 vớire.ASCIIflag).- Không dùng
[a-z]cho Unicode letters (tiếng Việt, tiếng Nhật...). - Dùng
\w(với Unicode mode mặc định) hoặc moduleregexvới\p{L}.
Ví dụ thực tế: Validate time format HH:MM:SS
# 00-23 : 00-59 : 00-59
time_pattern = r'([01]\d|2[0-3]):[0-5]\d:[0-5]\d'
tests = ['12:30:45', '23:59:59', '24:00:00', '12:60:00']
for t in tests:
print(f'{t} -> {bool(re.match(time_pattern, t))}')
Kết quả
12:30:45 -> True
23:59:59 -> True
24:00:00 -> False
12:60:00 -> False