Sử dụng Biểu thức chính quy với Module re trong Python

Biểu thức chính quy (Regular Expressions - Regex) là một công cụ mạnh mẽ dùng để mô tả và tìm kiếm các mẫu (pattern) trong chuỗi văn bản. Chúng cung cấp một cú pháp linh hoạt để xử lý các tác vụ phức tạp liên quan đến chuỗi mà các phương thức xử lý chuỗi cơ bản khó có thể thực hiện hiệu quả.

1. Giới thiệu về Biểu thức chính quy

Mặc dù Python cung cấp các phương thức chuỗi tiện lợi như startswith() hoặc endswith() để kiểm tra tiền tố hoặc hậu tố cố định, nhưng chúng không đủ mạnh khi cần tìm kiếm các mẫu phức tạp hơn, không cố định hoặc có nhiều biến thể. Ví dụ, để tìm tất cả các số điện thoại có định dạng khác nhau hoặc địa chỉ email trong một văn bản lớn, biểu thức chính quy trở nên không thể thiếu.

Về cơ bản, một biểu thức chính quy định nghĩa một "mẫu" chuỗi mà bạn muốn tìm. Sau đó, công cụ regex sẽ so sánh mẫu này với văn bản mục tiêu để xác định các vị trí khớp. Trong Python, thư viện chuẩn re cung cấp đầy đủ chức năng để làm việc với biểu thức chính quy.

2. Các phương thức cơ bản của module re

Module re cung cấp một bộ API mạnh mẽ để thao tác với biểu thức chính quy. Dưới đây là một số hàm thường dùng:

2.1. re.search(): Tìm kiếm lần khớp đầu tiên

Hàm re.search(pattern, string) quét qua string để tìm kiếm vị trí khớp đầu tiên với pattern. Nếu tìm thấy, nó trả về một đối tượng khớp (match object); nếu không, nó trả về None.


import re

# Ví dụ: Tìm mã sản phẩm dạng "SP-XXXXX"
thong_tin_san_pham = "Chúng tôi có các sản phẩm: SP-12345, SP-67890 và mã đối tác PD-001."
mau_sp = r"SP-\d+" # "SP-" theo sau bởi một hoặc nhiều chữ số

ket_qua_tim_kiem = re.search(mau_sp, thong_tin_san_pham)

if ket_qua_tim_kiem:
    print(f"Mã sản phẩm đầu tiên tìm thấy: {ket_qua_tim_kiem.group()}")
else:
    print("Không tìm thấy mã sản phẩm nào.")

# Output: Mã sản phẩm đầu tiên tìm thấy: SP-12345

2.2. re.findall(): Tìm tất cả các lần khớp

Hàm re.findall(pattern, string) trả về một danh sách tất cả các chuỗi con trong string khớp với pattern.


import re

# Ví dụ: Trích xuất tất cả các số từ một chuỗi phức tạp
chuoi_du_lieu = "Tổng cộng: 120.50 USD, Thuế: 10%, Giảm giá: 5.25 USD."
mau_so = r"\d+\.?\d*" # Tìm một hoặc nhiều chữ số, có thể có dấu chấm và chữ số sau đó

tat_ca_cac_gia_tri_so = re.findall(mau_so, chuoi_du_lieu)
print(f"Tất cả các giá trị số tìm được: {tat_ca_cac_gia_tri_so}")

# Output: Tất cả các giá trị số tìm được: ['120.50', '10', '5.25']

2.3. re.sub(): Thay thế chuỗi khớp

Hàm re.sub(pattern, repl, string, count=0) tìm tất cả các chuỗi con khớp với pattern trong string và thay thế chúng bằng repl. repl có thể là một chuỗi hoặc một hàm. Tham số count giới hạn số lần thay thế.

Thay thế bằng một chuỗi cố định:


import re

# Ví dụ: Thay thế tất cả các địa chỉ email bằng một placeholder
noi_dung_bao_mat = "Liên hệ qua email user@example.com hoặc admin@domain.org để được hỗ trợ."
mau_email = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"

ket_qua_thay_the_chuoi = re.sub(mau_email, "[EMAIL_AN_DANH]", noi_dung_bao_mat)
print(f"Sau khi thay thế email: {ket_qua_thay_the_chuoi}")

# Output: Sau khi thay thế email: Liên hệ qua email [EMAIL_AN_DANH] hoặc [EMAIL_AN_DANH] để được hỗ trợ.

Thay thế bằng kết quả của một hàm:

Khi repl là một hàm, hàm này sẽ được gọi cho mỗi lần khớp. Đối tượng khớp (match object) sẽ được truyền làm đối số cho hàm. Giá trị trả về của hàm sẽ được dùng làm chuỗi thay thế.


import re

# Ví dụ: Tăng giá trị của tất cả các số trong chuỗi lên 10 đơn vị
thong_tin_gia = "Sản phẩm A: 50. Giá trị B: 120. Tổng cộng: 170."

def tang_gia_tri_10(doi_tuong_khop):
    """Hàm này nhận một đối tượng khớp và trả về giá trị số đã tăng 10."""
    gia_tri_ban_dau = int(doi_tuong_khop.group())
    gia_tri_moi = gia_tri_ban_dau + 10
    return str(gia_tri_moi)

ket_qua_tang_gia = re.sub(r"\d+", tang_gia_tri_10, thong_tin_gia)
print(f"Sau khi tăng giá trị các số: {ket_qua_tang_gia}")

# Output: Sau khi tăng giá trị các số: Sản phẩm A: 60. Giá trị B: 130. Tổng cộng: 180.

2.4. re.split(): Tách chuỗi bằng biểu thức chính quy

Hàm re.split(pattern, string, maxsplit=0) tách string thành một danh sách các chuỗi con dựa trên các lần khớp của pattern. maxsplit giới hạn số lần tách.


import re

# Ví dụ: Tách một chuỗi dữ liệu bởi nhiều dấu phân cách khác nhau
du_lieu_thanh_phan = "Item_Code:A123;Price:25.50,Quantity-10"
# Tách theo các ký tự :, ;, , hoặc -
mau_phan_cach = r"[:;, -]" # Dấu cách cũng được coi là một dấu phân cách

cac_phan_du_lieu = re.split(mau_phan_cach, du_lieu_thanh_phan)
print(f"Các phần sau khi tách: {cac_phan_du_lieu}")

# Output: Các phần sau khi tách: ['Item_Code', 'A123', 'Price', '25.50', 'Quantity', '10']

Thẻ: python BiểuThứcChínhQuy regex reModule XửLýChuỗi

Đăng vào ngày 30 tháng 9 lúc 05:27