Ba metacharacter quan trọng nhất cho quantifier và wildcard.
1. Dấu chấm . - Wildcard
- Khớp bất kỳ ký tự đơn nào TRỪ newline (\n).
- Với flag
re.DOTALL(hoặcre.S): khớp cả newline. - Không phải quantifier - nó là atom (đơn vị khớp cơ bản).
re.match(r'a.c', 'abc') # Match
re.match(r'a.c', 'a\nc') # No match (mặc định)
re.match(r'a.c', 'a\nc', re.DOTALL) # Match
2. Dấu hỏi ? - Quantifier (0 hoặc 1)
- Làm cho element trước nó trở thành optional (khớp 0 hoặc 1 lần).
- Element có thể là: literal, character class, group, v.v.
re.match(r'ab?c', 'ac') # Match (b xuất hiện 0 lần)
re.match(r'ab?c', 'abc') # Match (b xuất hiện 1 lần)
re.match(r'ab?c', 'abbc') # No match (b xuất hiện 2 lần)
3. Asterisk * - Quantifier (0 hoặc nhiều)
- Khớp element trước nó 0, 1, 2, ... lần (bao nhiêu càng tốt - greedy).
re.match(r'ab*c', 'ac') # Match (b: 0 lần)
re.match(r'ab*c', 'abc') # Match (b: 1 lần)
re.match(r'ab*c', 'abbbc') # Match (b: 3 lần)
So sánh tóm tắt
| Ký tự | Loại | Số lần khớp | Ví dụ pattern | Khớp |
|---|---|---|---|---|
. | Atom (wildcard) | Chính xác 1 | a.c | abc, axc, a.c |
? | Quantifier | 0 hoặc 1 | ab?c | ac, abc |
* | Quantifier | 0, 1, 2, ... | ab*c | ac, abc, abbc, abbbc... |
+ | Quantifier | 1, 2, 3, ... | ab+c | abc, abbc, abbbc... (KHÔNG khớp ac) |
Non-greedy variants
*?: 0 hoặc nhiều, ít nhất có thể (lazy).+?: 1 hoặc nhiều, ít nhất có thể.??: 0 hoặc 1, ưu tiên 0.
text = 'content '
re.findall(r'.* ', text) # ['content '] - greedy
re.findall(r'.*? ', text) # ['content '] - lazy (cùng kết quả ở đây)
text2 = '1 2 '
re.findall(r'.* ', text2) # ['1 2 '] - greedy ăn hết
re.findall(r'.*? ', text2) # ['1 ', '2 '] - lazy đúng