Hướng dẫn python regex greedy - trăn regex tham lam

Tóm tắt: Trong hướng dẫn này, bạn sẽ tìm hiểu về chế độ tham lam Python Regex và cách thay đổi chế độ từ tham lam thành không tham lam.: in this tutorial, you’ll learn about the Python regex greedy mode and how to change the mode from greedy to non-greedy.

Theo mặc định, tất cả các bộ định lượng hoạt động trong chế độ tham lam. Điều đó có nghĩa là các bộ định lượng sẽ cố gắng phù hợp với các yếu tố trước của chúng càng nhiều càng tốt.

Hãy bắt đầu với một ví dụ để hiểu cách thức hoạt động của chế độ tham lam Regex.

Kết quả bất ngờ với chế độ tham lam

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

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

Code language: Python (python)

Và bạn muốn khớp các văn bản trong các trích dẫn ("") như submit

".+"

Code language: Python (python)
0.

Để làm điều đó, bạn có thể đưa ra mô hình sau bao gồm trích dẫn (Hồi), bộ ký tự DOT (

".+"

Code language: Python (python)
1) và bộ định lượng (

".+"

Code language: Python (python)
2):

".+"

Code language: Python (python)

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

  • ".+"

    Code language: Python (python)
    3 bắt đầu bằng một báo giá
  • ".+"

    Code language: Python (python)
    1 phù hợp với bất kỳ ký tự nào ngoại trừ dòng mới
  • ".+"

    Code language: Python (python)
    2 khớp với ký tự trước một hoặc nhiều lần
  • ".+"

    Code language: Python (python)
    3 kết thúc bằng một báo giá

Sau đây sử dụng hàm

".+"

Code language: Python (python)
7 để khớp chuỗi

".+"

Code language: Python (python)
8 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())

Code language: Python (python)

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

"submit" class="btn"

Code language: Python (python)

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

Theo mặc định, bộ định lượng (+) chạy ở chế độ tham lam, trong đó nó cố gắng khớp với phần tử trước (

".+"

Code language: Python (python)
9) càng nhiều càng tốt.

Làm thế nào Python Regex Chế độ tham lam hoạt động

Đầu tiên, động cơ Regex bắt đầu khớp với ký tự đầu tiên trong chuỗi

".+"

Code language: Python (python)
8.

Tiếp theo, vì ký tự đầu tiên là

import re s = '<button type="submit" class="btn">Send</button>' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

Code language: Python (python)
1 không khớp với báo giá (

".+"

Code language: Python (python)
3), động cơ Regex tiếp tục khớp với các ký tự tiếp theo cho đến khi nó đạt được báo giá đầu tiên (

".+"

Code language: Python (python)
3):

Hướng dẫn python regex greedy - trăn regex tham lam

Sau đó, động cơ Regex kiểm tra mẫu và khớp chuỗi với quy tắc tiếp theo

import re s = '<button type="submit" class="btn">Send</button>' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

Code language: Python (python)
4.

Bởi vì quy tắc

import re s = '<button type="submit" class="btn">Send</button>' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

Code language: Python (python)
4 khớp với một ký tự một hoặc nhiều lần, động cơ Regex khớp với tất cả các ký tự cho đến khi nó đi đến cuối chuỗi:

Sau đó, động cơ Regex kiểm tra quy tắc cuối cùng trong mẫu, đó là một trích dẫn (Hồi). Tuy nhiên, nó đã đạt đến cuối chuỗi. Không có nhân vật nào phù hợp. Nó là quá tham lam để đi quá xa.

Cuối cùng, động cơ Regex quay trở lại từ cuối chuỗi để tìm trích dẫn (Hồi). Bước này được gọi là quay lại.backtracking.

Kết quả là, trận đấu là chuỗi con sau đây không phải là những gì chúng tôi mong đợi:

"submit" class="btn"

Code language: Python (python)

Để khắc phục sự cố này, bạn cần hướng dẫn bộ định lượng (

".+"

Code language: Python (python)
2) để sử dụng chế độ không tham lam (hoặc lười biếng) thay vì chế độ tham lam.

Để làm điều đó, bạn thêm một dấu hỏi (

import re s = '<button type="submit" class="btn">Send</button>' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

Code language: Python (python)
7) sau khi định lượng như thế này:

".+?"

Code language: Python (python)

Chương trình sau đây trả về kết quả dự kiến:

import re s = '<button type="submit" class="btn">Send</button>' pattern = '".+?"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

Code language: Python (python)

Output:

"submit" "btn"

Code language: Python (python)

Bản tóm tắt

  • Theo mặc định, tất cả các bộ định lượng sử dụng chế độ tham lam.
  • Định lượng tham lam sẽ phù hợp với các yếu tố trước của chúng càng nhiều càng tốt.

Bạn có thấy hướng dẫn này hữu ích không?