Chuyển đến nội dung chính
Mô-đun 8 · Bài học 4 trong tổng số 432/36 trong khóa học~12 min
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:

Python
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

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

Trả 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ữ:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: chỉ ở đầu chuỗi

Python
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

Python
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:

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: thay thế

Python
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):

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

Nhóm được đặt tên

Python
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

Python
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 too

re.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ó

tập thể dục#python.m8.l4.e1
Nỗ lực: 0Đang tải…

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`.

Đang tải trình chỉnh sửa…
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

tập thể dục#python.m8.l4.e2
Nỗ lực: 0Đang tải…

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`.

Đang tải trình chỉnh sửa…
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

tập thể dục#python.m8.l4.e3
Nỗ lực: 0Đang tải…

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ó.

Đang tải trình chỉnh sửa…
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ử