Python regex pattern là string, có thể xây dựng động bằng concatenation hoặc f-string. Biến chứa pattern con không được chứa metacharacter nếu muốn khớp literal.
Ví dụ cơ bản: Concatenation
import re
s = 'I love books'
var_name = 'love'
# Xây dựng pattern: bất kỳ tiền tố + var_name + hậu tố
pattern = '(.+)' + var_name + '(.+)'
result = re.search(pattern, s)
print(result.group()) # I love books
Kết quả
<_sre.SRE_Match object at 0x...>
<_sre.SRE_Match object at 0x...>
⚠️ Vấn đề: Biến chứa metacharacter
var = 'love.' # Dấu chấm là metacharacter!
pattern = '(.+)' + var + '(.+)'
re.search(pattern, 'I loveXbooks') # KHỚP! Vì '.' khớp 'X'
Giải pháp: re.escape()
Escape tất cả metacharacter trong biến để khớp literal:
var = 'love.'
safe_var = re.escape(var) # 'love\.'
pattern = '(.+)' + safe_var + '(.+)'
re.search(pattern, 'I loveXbooks') # None
re.search(pattern, 'I love.books') # Match!
F-string (Python 3.6+) - Rõ ràng hơn
var = 'love'
pattern = fr'(.+){re.escape(var)}(.+)'
# hoặc nếu var đã safe
pattern = fr'(.+){var}(.+)'
Ví dụ thực tế: Tìm từ khóa động
def find_keyword(text, keyword):
"""Tìm keyword như từ hoàn chỉnh (word boundary)"""
pattern = rf'\b{re.escape(keyword)}\b'
return re.search(pattern, text, re.IGNORECASE)
print(find_keyword('I love Python', 'love')) # Match
print(find_keyword('I love Python', 'Py')) # None (không phải từ hoàn chỉnh)
print(find_keyword('I love Python', 'Python')) # Match
Tóm tắt
- Xây dựng pattern bằng string concatenation hoặc f-string.
- Luôn dùng
re.escape(var)nếu biến từ input người dùng/config. - Biến chứa pattern con phức tạp: truyền trực tiếp (đã là regex).
- Compile pattern nếu dùng lặp lại:
re.compile(pattern).