Dùng nhóm alternation (a|b) để khớp một trong hai ký tự. Có thể thêm flag re.I (IGNORECASE) để không phân biệt chữ hoa/thường.
Ví dụ cơ bản
import re
s = 'Bank of Baroda'
# Khớp 'a' hoặc 'b', không phân biệt hoa/thường
matches = re.findall(r'(a|b)', s, re.I)
print(matches)
# ['B', 'a', 'B', 'a', 'a']
Giải thích
(a|b): Group capturing, khớp 'a' HOẶC 'b'.re.I/re.IGNORECASE: Case-insensitive.findallvới capturing group trả về nội dung group (không phải toàn bộ match).
Các biến thể
# Non-capturing group (chỉ khớp, không capture)
re.findall(r'(?:a|b)', s, re.I) # ['a', 'b', 'a', 'a'] - không có 'B' vì group không capture
# Khớp toàn bộ từ chứa a/b
re.findall(r'\b\w*[ab]\w*\b', s, re.I) # ['Bank', 'Baroda']
# Character class thay thế (nhanh hơn cho single char)
re.findall(r'[ab]', s, re.I) # ['B', 'a', 'B', 'a', 'a']
Mở rộng: Nhiều lựa chọn hơn
# Khớp 'cat', 'dog', hoặc 'bird'
re.findall(r'(cat|dog|bird)', text, re.I)
# Khớp từ bắt đầu bằng a hoặc b
re.findall(r'\b[ab]\w*', text, re.I)
Lưu ý hiệu năng
- Character class
[ab]nhanh hơn alternation(a|b)cho single character. - Alternation cần thiết khi các lựa chọn là chuỗi nhiều ký tự.
- Thứ tự trong alternation quan trọng: regex thử từ trái sang phải.