Cả hai đều tìm tất cả non-overlapping matches, nhưng kiểu trả về và trường hợp dùng khác nhau.
re.findall() - Trả về List
- Trả về
listcủa strings (hoặc tuples nếu có capturing groups). - Đơn giản, tiện cho extract data nhanh.
- Không cung cấp vị trí (start/end) của match.
import re
text = 'TP Tutorials Point TP'
# Không group
print(re.findall(r'TP', text)) # ['TP', 'TP']
# Có group
print(re.findall(r'(T)(P)', text)) # [('T', 'P'), ('T', 'P')]
re.finditer() - Trả về Iterator of Match Objects
- Trả về iterator các
MatchObject. - Cho phép truy cập:
.group(),.start(),.end(),.span(),.groups(),.groupdict(). - Lazy evaluation (tính toán khi iterate) - tiết kiệm bộ nhớ cho input lớn.
s1 = 'Blue Berries'
pattern = 'Blue Berries'
for match in re.finditer(pattern, s1):
s = match.start()
e = match.end()
print(f'Match "{s1[s:e]}" at {s}:{e}')
# Match "Blue Berries" at 0:12
So sánh chi tiết
| Đặc điểm | re.findall() | re.finditer() |
|---|---|---|
| Return type | list | iterator |
| Memory | Load all ngay | Lazy (mỗi match một) |
| Position info | Không | Có (.start(), .end()) |
| Group access | Qua tuple/list | Qua .group(), .groups() |
| Named groups | Không trực tiếp | .group('name'), .groupdict() |
| Dùng khi | Chỉ cần giá trị, input nhỏ | Cần vị trí, input lớn, named groups |
Khi nào dùng finditer()?
- Cần highlight/vị trí match trong text editor, log analysis.
- Xử lý file lớn (streaming).
- Cần named groups (
match.groupdict()). - Cần overlap matches (dùng lookahead trong finditer).