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:
1 | 2 | Khớp với phần tử trước đó bằng 0 hoặc nhiều lần. |
3 | 4 | Khớp với phần tử trước của nó một hoặc nhiều lần. |
0 | 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; ________ 20 | Khớ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; ________ 24 | Khớ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; ________ 20 | Khớ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 [
4] để khớp với văn bản trong các trích dẫn [Code language: Python [python]
"submit" "btn"
2] của một phần tử nút:Code language: Python [python]
".+"
Code language: Python [python]
import re s = 'Send' pattern = '".+?"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
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:
Code language: Python [python]
s = 'Send'
Và bạn muốn khớp các văn bản trong các trích dẫn [
2] nhưCode language: Python [python]
".+"
4 vàCode language: Python [python]
".+"
5.Code language: Python [python]
".+"
Để 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 [
6] và bộ định lượng [Code language: Python [python]
".+"
3]:Code language: Python [python]
"submit" "btn"
Code language: Python [python]
".+"
Ý nghĩa của mẫu như sau:
8 bắt đầu bằng một báo giá".+"
6 khớp với bất kỳ ký tự nào ngoại trừ dòng mới
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]"submit" "btn"
8 kết thúc bằng một báo giá
Code language: Python [python]".+"
Sau đây sử dụng hàm
2 để khớp chuỗiCode language: Python [python]
import re s = 'Send' pattern = '".+"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
3 với mẫu:Code language: Python [python]
import re s = 'Send' pattern = '".+"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
Code language: Python [python]
import re s = 'Send' pattern = '".+"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
Chương trình hiển thị kết quả sau:
Code language: Python [python]
"submit" class="btn"
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 [
4] càng nhiều càng tốt.Code language: Python [python]
import re s = 'Send' pattern = '".+"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
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
3.Code language: Python [python]
import re s = 'Send' pattern = '".+"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
Tiếp theo, vì ký tự đầu tiên là
6 không khớp với báo giá [Code language: Python [python]
import re s = 'Send' pattern = '".+"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
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]:Code language: Python [python]
".+"
Sau đó, động cơ Regex kiểm tra mẫu và khớp chuỗi với quy tắc tiếp theo
9.Code language: Python [python]
import re s = 'Send' pattern = '".+"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
Bởi vì quy tắc
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:Code language: Python [python]
import re s = 'Send' pattern = '".+"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
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:
Code language: Python [python]
"submit" class="btn"
Để khắc phục sự cố này, bạn cần hướng dẫn bộ định lượng [
3] sử dụng chế độ không tham lam [hoặc lười biếng] thay vì chế độ tham lam.Code language: Python [python]
"submit" "btn"
Để làm điều đó, bạn thêm một dấu hỏi [
0] sau khi định lượng như thế này:Code language: Python [python]
"submit" "btn"
Code language: Python [python]
".+?"
Chương trình sau đây trả về kết quả dự kiến:
Code language: Python [python]
import re s = 'Send' pattern = '".+?"' matches = re.finditer[pattern, s] for match in matches: print[match.group[]]
Output:
Code language: Python [python]
"submit" "btn"
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?