Bài học theo mô-đun (4/4)
mô-đun lại: biểu thức chính quy trong Python
Mô-đun re hiển thị các biểu thức chính quy trong Python. Nếu bạn đã lấy
khóa học Regex trên trang này, bạn sẽ thấy tất cả các cú pháp quen thuộc; ở đây
chúng tôi xem xét các API.
Chuỗi thô: r"..."
Regexes sử dụng nhiều dấu gạch chéo ngược (\d, \b, \s). Luôn viết chúng như
chuỗi thô nên bạn không cần phải nhân đôi chúng:
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"re.search: tìm lần xuất hiện đầu tiên
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group() # '42'
m.start() # 3
m.end() # 5Trả về đối tượng Match nếu tìm thấy, None nếu không tìm thấy. Mẫu thành ngữ:
if m := re.search(r"\d+", testo):
print(m.group())re.match: chỉ ở đầu chuỗi
re.match(r"\d+", "42 anni") # match!
re.match(r"\d+", "ho 42 anni") # None (doesn't start with a digit)Để tìm kiếm ở bất kỳ đâu, hãy ưu tiên re.search.
re.findall: tất cả các lần xuất hiện
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']Nếu mẫu có chụp nhóm, findall trả về các nhóm chứ không phải
cả trận đấu:
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]re.sub: thay thế
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'Nó cũng hoạt động với chức năng thay thế (nhận Trận đấu):
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'Nhóm được đặt tên
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno") # '2025'
m.groupdict() # {'anno': '2025', 'mese': '01', 'giorno': '15'}Cờ hữu ích
re.search(r"ciao", "CIAO", re.IGNORECASE) # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE) # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL) # . matches newline toore.finditer để đảm bảo an toàn cho bộ nhớ
Nếu bạn cần xử lý các kết quả khớp trong một khối văn bản lớn, re.findall sẽ phân bổ một danh sách trong bộ nhớ chứa tất cả các chuỗi khớp được trích xuất. Nên sử dụng re.finditer() để tạo ra một trình lặp lười biếng của các đối tượng Match, tiêu thụ bộ nhớ tối thiểu.
Hãy thử nó
Cho `text = 'ordine #123, tổng €45,50, Ricevuta #456'`, trích xuất TẤT CẢ các số thứ tự (các chữ số sau #) thành `orders` dưới dạng danh sách các chuỗi. Đánh giá `đơn đặt hàng`.
Hiển thị gợi ý
re.findall(r"#(\\d+)", text) — nhóm chỉ chụp các chữ số.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Cho `s = 'tel: 06-12345678 e tel: 02-9876'`, thay thế tất cả các số điện thoại (định dạng \\d+-\\d+) bằng chuỗi 'XXX' và gán cho `masked`. Đánh giá `che giấu`.
Hiển thị gợi ý
re.sub(r"\\d+-\\d+", "XXX", s)
Giải pháp khả dụng sau 3 lần thử
Thử thách bổ sung
Nhập mô-đun \`re\`. Trích xuất tất cả các số bao gồm một hoặc nhiều chữ số từ chuỗi \`log_line = "Lỗi 404 trong 15ms"\`. Lưu trữ danh sách trong \`numbers\` và đánh giá nó.
Hiển thị gợi ý
Sử dụng re.findall(r'\\d+', log_line) để trích xuất tất cả các số dưới dạng danh sách các chuỗi.
Giải pháp khả dụng sau 3 lần thử