Dùng backreference \1 để tham chiếu đến group capturing đầu tiên, kết hợp quantifier để tìm ký tự lặp lại.
Ví dụ: Tìm 4 chữ số giống nhau liên tiếp
import re
# (\d) capture 1 digit, \1{3} lặp lại 3 lần nữa (tổng 4 lần)
pattern = r'(\d)\1{3}'
text = '54222267890'
match = re.search(pattern, text)
if match:
print(match.group()) # 2222
Kết quả
2222
Giải thích Pattern
(\d): Group 1 - capture 1 chữ số bất kỳ.\1: Backreference - khớp CHÍNH XÁC ký tự đã capture ở group 1.{3}: Quantifier - lặp lại 3 lần.- → Tổng cộng 4 chữ số giống nhau liên tiếp.
Các biến thể
| Pattern | Khớp |
|---|---|
(\d)\1+ | 2+ chữ số giống nhau liên tiếp |
(\d)\1{2} | Chính xác 3 chữ số giống nhau |
(\d)\1{3,} | 4+ chữ số giống nhau |
(\d)\1 | Cặp chữ số giống nhau (doublet) |
Ứng dụng: Validate không cho phép 4 số lặp (thẻ tín dụng, OTP...)
def has_repeating_digits(s, min_repeat=4):
pattern = rf'(\d)\1{{{min_repeat-1},}}'
return bool(re.search(pattern, s))
print(has_repeating_digits('1234567890')) # False
print(has_repeating_digits('1111234567')) # True
print(has_repeating_digits('1234444567')) # True
Lưu ý
- Backreference
\1chỉ hoạt động trong cùng một pattern. - Trong replacement string (
re.sub), dùng\1hoặc\g<1>. - Named group:
(?P.\d)(?P=digit){3}