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

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

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 đíchHà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 patternre.fullmatch() (Python 3.4+)
Lấy TẤT CẢ matches dưới dạng stringre.findall()
Lấy TẤT CẢ matches với vị trí, groupsre.finditer()
Chỉ kiểm tra đầu stringre.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.