Dùng regex tìm pattern ngày tháng (YYYY-MM-DD, DD/MM/YYYY, v.v.) trong text, sau đó parse sang datetime.date object.
Ví dụ: Extract ISO date (YYYY-MM-DD)
import re
from datetime import datetime
text = "Jason's birthday is on 1991-09-21"
# Pattern: 4 digits - 2 digits - 2 digits
match = re.search(r'\d{4}-\d{2}-\d{2}', text)
if match:
date_str = match.group()
# Parse sang date object
date_obj = datetime.strptime(date_str, '%Y-%m-%d').date()
print(date_obj) # 1991-09-21
print(type(date_obj)) #
Kết quả
1991-09-21
Các pattern ngày tháng phổ biến
| Format | Regex Pattern | strptime format |
|---|---|---|
| YYYY-MM-DD | \d{4}-\d{2}-\d{2} | %Y-%m-%d |
| DD/MM/YYYY | \d{2}/\d{2}/\d{4} | %d/%m/%Y |
| MM/DD/YYYY | \d{2}/\d{2}/\d{4} | %m/%d/%Y |
| DD-MM-YYYY | \d{2}-\d{2}-\d{4} | %d-%m-%Y |
| Month name | \d{1,2}\s+(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\s+\d{4} | %d %b %Y |
Extract nhiều ngày
text = "Meetings: 2024-01-15, 2024-02-20, 2024-03-10"
dates = re.findall(r'\d{4}-\d{2}-\d{2}', text)
date_objects = [datetime.strptime(d, '%Y-%m-%d').date() for d in dates]
print(date_objects)
# [datetime.date(2024, 1, 15), datetime.date(2024, 2, 20), datetime.date(2024, 3, 10)]
Validate ngày hợp lệ (regex không đủ)
Regex chỉ kiểm tra format. Ngày như 2024-02-31 hoặc 2023-02-29 pass regex nhưng invalid. Cần parse bằng strptime (sẽ raise ValueError nếu invalid):
def extract_valid_dates(text, pattern=r'\d{4}-\d{2}-\d{2}', fmt='%Y-%m-%d'):
dates = []
for match in re.finditer(pattern, text):
try:
dates.append(datetime.strptime(match.group(), fmt).date())
except ValueError:
pass # Invalid date (Feb 31, etc.)
return dates