Trong Regular Expression, hầu hết ký tự khớp chính với chính nó. Nhưng Metacharacters (ký tự đặc biệt) có ý nghĩa đặc biệt. Tuy nhiên, bên trong Character Class [...], hầu hết metacharacters mất tác dụng đặc biệt và trở thành ký tự thường.
Danh sách Metacharacters tổng quát
. ^ $ * + ? { } [ ] \ | ( )
Bên trong Character Class [...]
| Ký tự | Ý nghĩa bên trong [... ] |
|---|---|
] | Kết thúc class (nếu không phải ký tự đầu). Phải escape \] để khớp ']'. |
\ | Escape character. \\ khớp '\', \] khớp ']'. |
- | Tạo range (ví dụ a-z). Nếu ở đầu/cuối hoặc escape \- thì khớp '-'. |
^ | Chỉ có tác dụng phủ định nếu là ký tự đầu tiên sau [. Vị trí khác: khớp '^' thường. |
Các ký tự khác (.$*+?{}()|) | Mất tác dụng đặc biệt, khớp chính với chính nó. |
Ví dụ minh họa
import re
# [$] khớp ký tự '$' (không phải end-of-string)
print(re.findall(r'[$]', "Price: $100")) # ['$']
# [.] khớp dấu chấm '.'
print(re.findall(r'[.]', "a.b.c")) # ['.', '.']
# [()] khớp ngoặc
print(re.findall(r'[()]', "(a) + (b)")) # ['(', ')', '(', ')']
# [^] ở đầu = phủ định
print(re.findall(r'[^0-9]', "abc123")) # ['a', 'b', 'c']
# [a-z-] khớp a-z và '-'
print(re.findall(r'[a-z-]', "a-b-c")) # ['a', '-', 'b', '-', 'c']
Escape bên trong Class
Chỉ cần escape ], \, - (nếu không ở đầu/cuối), ^ (nếu ở đầu).
r'[\]]' # Khớp ']'
r'[\\]' # Khớp '\'
r'[\-a-z]' # Khớp '-' và a-z (dấu - ở đầu)
r'[a-z\-]' # Khớp a-z và '-' (dấu - ở cuối)
r'[\^abc]' # Khớp '^', 'a', 'b', 'c'
Tóm tắt
Bên trong [...], regex engine "tắt" hầu hết metacharacters. Chỉ ], \, -, ^ (vị trí đầu) giữ ý nghĩa đặc biệt. Điều này làm cho character class an toàn và dễ dự đoán.