Hướng dẫn greedy and non greedy regex in python - regex tham lam và không tham lam trong python

Tóm tắt: Trong hướng dẫn này, bạn sẽ tìm hiểu về các bộ định lượng không màu xanh lá cây (hoặc lười biếng) phù hợp với các yếu tố trước đó của chúng càng ít càng tốt.: in this tutorial, you’ll learn about the regex non-greedy (or lazy) quantifiers that match their preceding elements as few times as possible.

Giới thiệu về các bộ định lượng không màu xanh lá cây (hoặc lười biếng) Regex

Định lượng cho phép bạn phù hợp với các yếu tố trước của chúng một số lần. Định lượng hoạt động ở một trong hai chế độ: tham lam và không tham lam (lười biếng).

Khi các bộ định lượng hoạt động trong chế độ tham lam, chúng được gọi là định lượng tham lam. Tương tự, khi các bộ định lượng hoạt động ở chế độ không màu xanh lá cây, chúng được gọi là các bộ định lượng không màu xanh lá cây hoặc các bộ định lượng lười biếng.

Theo mặc định, 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 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 để trở lại trận đấu lớn nhất có thể.

Mặt khác, các bộ định lượng không màu xanh lá cây sẽ phù hợp càng ít càng tốt để trả về trận đấu nhỏ nhất có thể. Định lượng không xanh là trái ngược với những người tham lam.

Để biến các bộ định lượng tham lam thành các bộ định lượng không tham lam, bạn thêm một dấu hỏi thêm (____10) vào các bộ định lượng. Bảng sau đây cho thấy các định lượng không tham lam và các định lượng không tham gia tương ứng của chúng:

Định lượng tham lamĐịnh lượng lười biếngNghĩa

"submit" "btn"

Code language: Python (python)
1

"submit" "btn"

Code language: Python (python)
2
Khớp với phần tử trước đó bằng 0 hoặc nhiều lần.

"submit" "btn"

Code language: Python (python)
3

"submit" "btn"

Code language: Python (python)
4
Khớp với phần tử trước của nó một hoặc nhiều lần.

"submit" "btn"

Code language: Python (python)
0

"submit" "btn"

Code language: Python (python)
6
Khớp với phần tử trước đó bằng không hoặc một lần.
________ 17 & nbsp; n & nbsp; ________ 18________ 17 & nbsp; n & nbsp; ________ 20Khớp chính xác phần tử trước của nó & nbsp; n & nbsp; thời gian.
________ 17 & nbsp; n & nbsp; ________ 22________ 17 & nbsp; n & nbsp; ________ 24Khớp với phần tử trước của nó ít nhất là & nbsp; n & nbsp; lần.
________ 17 & nbsp; n & nbsp; ________ 26 & nbsp; m & nbsp; ________ 18________ 17 & nbsp; n & nbsp; ________ 26 & nbsp; m & nbsp; ________ 20Khớp với phần tử trước của nó từ & nbsp; n & nbsp; với & nbsp; m & nbsp; thời gian.

Chương trình sau đây sử dụng bộ định lượng không màu xanh lá cây (

"submit" "btn"

Code language: Python (python)
4) để khớp với văn bản trong các trích dẫn (

".+"

Code language: Python (python)
2) của một phần tử nút:

import re s = '' 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

  • Định lượng không màu xanh lá cây phù hợp với các yếu tố trước của chúng càng ít càng tốt để trả về trận đấu nhỏ nhất có thể.
  • Thêm một dấu hỏi (?) Vào một bộ định lượng để biến nó thành một bộ định lượng không màu xanh lá cây.

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

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 = ''

Code language: Python (python)

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

".+"

Code language: Python (python)
2) như

".+"

Code language: Python (python)
4 và

".+"

Code language: Python (python)
5.

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

".+"

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

"submit" "btn"

Code language: Python (python)
3):

".+"

Code language: Python (python)

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

  • ".+"

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

    Code language: Python (python)
    6 khớp với bất kỳ ký tự nào ngoại trừ dòng mới
  • "submit" "btn"

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

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

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

import re s = '' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

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

import re s = '' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

Code language: Python (python)
3 với mẫu:

import re s = '' 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 (

import re s = '' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

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

import re s = '' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

Code language: Python (python)
3.

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

import re s = '' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

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

".+"

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

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 = '' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

Code language: Python (python)
9.

Bởi vì quy tắc

import re s = '' pattern = '".+"' matches = re.finditer(pattern, s) for match in matches: print(match.group())

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

Hướng dẫn greedy and non greedy regex in python - regex tham lam và không tham lam trong python

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 (

"submit" "btn"

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

"submit" "btn"

Code language: Python (python)
0) 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 = '' 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?

Regex tham lam là gì?

Tham lam: càng nhiều càng tốt (ví dụ như trận đấu dài nhất), lấy bộ định lượng +. Nó cho phép động cơ khớp với một hoặc nhiều mã thông báo mà nó định lượng: \ d+ do đó có thể khớp với một hoặc nhiều chữ số. Nhưng "một hoặc nhiều" khá mơ hồ: trong chuỗi 123, "một hoặc nhiều chữ số" (bắt đầu từ bên trái) có thể là 1, 12 hoặc 123.As Many As Possible (longest match) For instance, take the + quantifier. It allows the engine to match one or more of the token it quantifies: \d+ can therefore match one or more digits. But "one or more" is rather vague: in the string 123, "one or more digits" (starting from the left) could be 1, 12 or 123.

Ý nghĩa của việc không tham lam là gì?

Từ 'thanh đạm' có thể được sử dụng để mô tả một người 'không tham lam. 'Tom là một người đàn ông thanh đạm. Từ thanh đạm có nghĩa là: kinh tế trong sử dụng hoặc chi tiêu; thận trọng tiết kiệm hoặc tiết kiệm; không lãng phí.economical in use or expenditure; prudently saving or sparing; not wasteful.

Mô hình tham lam là gì?

'Tham lam' có nghĩa là khớp chuỗi dài nhất có thể.'Lazy' có nghĩa là khớp chuỗi ngắn nhất có thể.Ví dụ, tham lam h.+l khớp với 'địa ngục' trong 'xin chào' nhưng lười biếng h.match longest possible string. 'Lazy' means match shortest possible string. For example, the greedy h. +l matches 'hell' in 'hello' but the lazy h.

Các loại biểu thức thông thường khác nhau trong Python là gì?

Python cung cấp hai hoạt động nguyên thủy khác nhau dựa trên các biểu thức thông thường: kiểm tra đối sánh chỉ cho một trận đấu ở đầu chuỗi, trong khi tìm kiếm kiểm tra đối sánh ở bất cứ đâu trong chuỗi (đây là những gì Perl làm theo mặc định).match checks for a match only at the beginning of the string, while search checks for a match anywhere in the string (this is what Perl does by default).