PYTHON REGEX
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Chế độ Greedy trong Regex Python

Một trong những khía cạnh quan trọng và thú vị của biểu thức chính quy là cách các lượng từ (quantifiers) hoạt động, đặc biệt là ở chế độ greedy (tham lam). Khi làm việc với regex trong Python, hiểu rõ về chế độ greedy và cách thay đổi nó sang chế độ non-greedy (không tham lam) sẽ giúp bạn kiểm soát tốt hơn việc khớp chuỗi và tránh được những kết quả không mong đợi. Bài viết này sẽ hướng dẫn bạn cách sử dụng và điều chỉnh chế độ greedy trong Python regex để cải thiện hiệu suất và độ chính xác khi làm việc với chuỗi văn bản.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Chế độ greedy trong Regex Python

Mặc định, tất cả các lượng từ trong regex hoạt động ở chế độ greedy. Điều này có nghĩa là các lượng từ sẽ cố gắng khớp phần tử liền trước của chúng càng nhiều càng tốt.

Ví dụ về kết quả không mong đợi khi sử dụng chế độ greedy

Giả sử bạn có đoạn HTML sau đây đại diện cho một phần tử nút bấm:

s = '<button type="submit" class="btn">Send</button>'

Bạn muốn khớp các văn bản nằm trong dấu ngoặc kép (""), như "submit" và "btn".

Bài viết này được đăng tại [free tuts .net]

Để làm điều đó, bạn có thể nghĩ đến mẫu sau đây bao gồm dấu ngoặc kép ("), tập hợp ký tự dấu chấm (.), và lượng từ (+):

".+"

Ý nghĩa của mẫu này như sau:

  • " bắt đầu với dấu ngoặc kép
  • . khớp với bất kỳ ký tự nào ngoại trừ dòng mới
  • + khớp với ký tự liền trước nó một hoặc nhiều lần
  • " kết thúc với dấu ngoặc kép

Chương trình sau đây sử dụng hàm finditer() để khớp chuỗi s với mẫu:

import re

s = '<button type="submit" class="btn">Send</button>'

pattern = '".+"'
matches = re.finditer(pattern, s)

for match in matches:
    print(match.group())

Chương trình hiển thị kết quả sau:

"submit" class="btn"

Kết quả này không phải là những gì bạn mong đợi.

Mặc định, lượng từ (+) hoạt động ở chế độ greedy, trong đó nó cố gắng khớp phần tử liền trước (".") càng nhiều càng tốt.

Cách hoạt động của chế độ greedy trong Regex Python

Đầu tiên, công cụ regex bắt đầu khớp từ ký tự đầu tiên trong chuỗi s.

Tiếp theo, vì ký tự đầu tiên là < không khớp với dấu ngoặc kép ("), công cụ regex tiếp tục khớp các ký tự tiếp theo cho đến khi đạt đến dấu ngoặc kép đầu tiên ("):

Screenshot 202024 07 10 20115825 png

Sau đó, công cụ regex kiểm tra mẫu và khớp chuỗi với quy tắc tiếp theo . +.

Vì quy tắc . + khớp một ký tự một hoặc nhiều lần, công cụ regex khớp tất cả các ký tự cho đến khi đạt đến cuối chuỗi:

Screenshot 202024 07 10 20115844 png

Sau đó, công cụ regex kiểm tra quy tắc cuối cùng trong mẫu, đó là dấu ngoặc kép ("). Tuy nhiên, nó đã đạt đến cuối chuỗi. Không còn ký tự nào để khớp. Nó quá greedy để đi quá xa.

Cuối cùng, công cụ regex quay lại từ cuối chuỗi để tìm dấu ngoặc kép ("). Bước này được gọi là backtracking.

Screenshot 202024 07 10 20115855 png

Kết quả là, chuỗi khớp là phần con sau đây, không phải là những gì chúng ta mong đợi:

Screenshot 202024 07 10 20115906 png

"submit" class="btn"

Để khắc phục vấn đề này, bạn cần chỉ định lượng từ (+) sử dụng chế độ non-greedy (hoặc lazy) thay vì chế độ greedy.

Để làm điều đó, bạn thêm dấu hỏi (?) sau lượng từ như sau:

".+?"

Chương trình sau đây trả về kết quả mong đợi:

import re

s = '<button type="submit" class="btn">Send</button>'

pattern = '".+?"'
matches = re.finditer(pattern, s)

for match in matches:
    print(match.group())

Kết quả:

"submit"
"btn"

Kết Bài

Hiểu rõ cách thức hoạt động của chế độ greedy trong Python regex và cách chuyển sang chế độ non-greedy là một kỹ năng quan trọng cho bất kỳ lập trình viên nào thường xuyên làm việc với chuỗi văn bản. Bằng cách nắm vững khái niệm này, bạn có thể tránh được những kết quả không mong đợi và tối ưu hóa quá trình xử lý chuỗi. Qua các ví dụ và hướng dẫn trong bài viết này, hy vọng bạn đã có cái nhìn rõ ràng hơn về cách sử dụng lượng từ trong regex, giúp bạn áp dụng hiệu quả trong các dự án lập trình của mình. Hãy luôn thực hành và thử nghiệm để trở thành một chuyên gia trong việc sử dụng biểu thức chính quy!

Cùng chuyên mục:

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Cách nạp dữ liệu Machine Learning từ File trong Python

Cách nạp dữ liệu Machine Learning từ File trong Python

Hướng dẫn sử dụng Google Sheets API với Python

Hướng dẫn sử dụng Google Sheets API với Python

Xây dựng  web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn viết Snake Game bằng Python

Hướng dẫn viết Snake Game bằng Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng Python Debugger với hàm breakpoint()

Cách sử dụng Python Debugger với hàm breakpoint()

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hỗ trợ Async trong Django 3.1

Hỗ trợ Async trong Django 3.1

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

Ý nghĩa của if __name__ ==

Ý nghĩa của if __name__ == "__main__" trong Python

Cách xóa phần tử trong danh sách Python

Cách xóa phần tử trong danh sách Python

Top