re.search() và re.findall() đều tìm pattern trong string, nhưng trả về khác nhau.
re.search() - Tìm match ĐẦU TIÊN
- Trả về Match object (hoặc None).
- Chỉ tìm match đầu tiên từ trái sang phải.
- Có phương thức
.group(),.start(),.end(),.span().
import re
text = 'TP Tutorials Point TP'
match = re.search(r'TP', text)
print(match.group()) # 'TP' (match đầu tiên)
print(match.span()) # (0, 2)
re.findall() - Tìm TẤT CẢ matches
- Trả về list of strings (hoặc list of tuples nếu có group).
- Tìm tất cả non-overlapping matches.
- Không trả về vị trí (start/end).
matches = re.findall(r'TP', text)
print(matches) # ['TP', 'TP'] - tìm thấy 2 lần
Khác biệt quan trọng: Capturing Groups
text = '2024-01-15, 2023-12-31'
# CÓ capturing group -> findall trả về tuple groups
pattern_with_group = r'(\d{4})-(\d{2})'
print(re.findall(pattern_with_group, text))
# [('2024', '01'), ('2023', '12')]
# KHÔNG capturing group -> findall trả về full match
pattern_no_group = r'\d{4}-\d{2}'
print(re.findall(pattern_no_group, text))
# ['2024-01', '2023-12']
# Non-capturing group (?:...) -> vẫn trả về full match
pattern_noncap = r'(?:\d{4})-(\d{2})'
print(re.findall(pattern_noncap, text))
# ['01', '12'] - chỉ group capturing được trả về
Khi nào dùng cái nào?
| Mục đích | Hàm |
|---|---|
| Kiểm tra có khớp không / Lấy match đầu tiên / Lấy vị trí | re.search() |
| Validate toàn bộ string khớp pattern | re.fullmatch() (Python 3.4+) |
| Lấy TẤT CẢ matches dưới dạng string | re.findall() |
| Lấy TẤT CẢ matches với vị trí, groups | re.finditer() |
| Chỉ kiểm tra đầu string | re.match() |
Lời khuyên
Luôn ưu tiên re.findall() hoặc re.finditer() khi cần extract data, vì chúng xử lý tất cả matches một cách nhất quán.