Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Khác biệt giữa re.findall() và re.finditer() trong Python Regex

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ề list củ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ểmre.findall()re.finditer()
Return typelistiterator
MemoryLoad all ngayLazy (mỗi match một)
Position infoKhôngCó (.start(), .end())
Group accessQua tuple/listQua .group(), .groups()
Named groupsKhông trực tiếp.group('name'), .groupdict()
Dùng khiChỉ 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).