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

Để bắt đầu, tôi không đề nghị sử dụng "*" trong regexes. Vâng, tôi biết, nó là dấu phân cách đa nhân vật được sử dụng nhiều nhất, nhưng nó vẫn là một ý tưởng tồi. Điều này là do, trong khi nó phù hợp với bất kỳ số lượng lặp lại nào cho nhân vật đó, "bất kỳ" nào "bao gồm 0, thường là thứ bạn muốn ném lỗi cú pháp cho, không chấp nhận. Thay vào đó, tôi đề nghị sử dụng dấu +, phù hợp với bất kỳ sự lặp lại độ dài nào> 1. Hơn nữa, từ những gì tôi có thể thấy, bạn đang xử lý các biểu thức dấu ngoặc đơn có độ dài cố định. Do đó, bạn có thể có thể sử dụng cú pháp {x, y} để chỉ định cụ thể độ dài mong muốn.

Tuy nhiên, nếu bạn thực sự cần sự lặp lại không màu xanh lá cây, tôi khuyên bạn nên tham khảo ý kiến ​​? toàn năng. Điều này, khi được đặt sau khi kết thúc bất kỳ trình xác định lặp lại Regex nào, sẽ buộc một phần của Regex phải tìm thấy số lượng văn bản ít nhất có thể.

Điều đó đang được nói, tôi sẽ rất cẩn thận với ? vì nó, giống như tuốc nơ vít âm thanh ở Tiến sĩ Who, có xu hướng làm, tôi nên đặt nó như thế nào, "hơi" những điều không mong muốn nếu không được hiệu chỉnh cẩn thận. Ví dụ: để sử dụng đầu vào ví dụ của bạn, nó sẽ xác định ((1) (lưu ý việc thiếu RPAREN thứ hai) là một trận đấu.

Tôi có một chuỗi (từ một tệp):

ILX (New for 2013!)

Overview: The least expensive route to Honda's premium-label goodness

Drivetrain: Two four-cylinder engines to choose from as well as a gas-electric hybrid; front-wheel-drive only.

Làm thế nào tôi nhận được chuỗi:

$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);

Tôi muốn khớp với dòng tổng quan (

$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);
0. Cách tốt nhất để đạt được điều này là gì.

Tôi đã thử.*\ N, nhưng điều đó sẽ phù hợp với mọi thứ và sau đó là một dòng mới. Có cách nào để làm cho regex không xanh không?

Tôi đã thử:

$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);
1 và tôi không nhận được bất kỳ trận đấu nào

hỏi ngày 19 tháng 2 năm 2013 lúc 21:10Feb 19, 2013 at 21:10

Chris Muenchchris MuenchChris Muench

17.9K69 Huy hiệu vàng204 Huy hiệu bạc352 Huy hiệu Đồng69 gold badges204 silver badges352 bronze badges

3

Thêm ? sau khi định lượng để làm cho nó trở nên khó khăn. Trong trường hợp này, Regex của bạn sẽ là

$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);
3.

Để phù hợp cụ thể với dòng bắt đầu với "Tổng quan:", hãy sử dụng regex này:

/^Overview:\s.*$/im

Bộ điều chỉnh

$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);
4 cho phép
$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);
5 và
$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);
6 khớp với phần bắt đầu và kết thúc của các dòng thay vì toàn bộ chuỗi tìm kiếm. Lưu ý rằng không cần phải làm cho nó trở nên khó khăn vì
$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);
7 không khớp với NewLines trừ khi bạn sử dụng công cụ sửa đổi
$writeup = file_get_contents($car_files_path . $manufacture . '/Stories/'.$story);
8 - trên thực tế, làm cho nó trở nên khó khăn ở đây sẽ xấu cho hiệu suất.

Đã trả lời ngày 19 tháng 2 năm 2013 lúc 21:13Feb 19, 2013 at 21:13

9

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

Trong các biểu thức thường xuyên, các định lượng có hai phiên bản: tham lam và không tham lam (hoặc lười biếng). Trong hướng dẫn trước, bạn đã học được cách thức định lượng tham lam hoạt động.

Để biến một bộ định lượng tham lam thành một bộ định lượng không tham lam, bạn có thể nối một dấu hỏi (?) vào nó. Bảng dưới đây cho thấy các định lượng tham lam và không tham lam:

Định lượng tham lamĐịnh lượng lười biếngNghĩa
/^Overview:\s.*$/im
0
/^Overview:\s.*$/im
1
Khớp với phần tử trước đó bằng 0 hoặc nhiều lần.
+
/^Overview:\s.*$/im
3
Khớp với phần tử trước của nó một hoặc nhiều lần.
?
/^Overview:\s.*$/im
5
Khớp với phần tử trước đó bằng không hoặc một lần.
________ 26 & nbsp; n & nbsp; ________ 27________ 26 & nbsp; n & nbsp; ________ 29Khớp chính xác phần tử trước của nó & nbsp; n & nbsp; thời gian.
________ 26 & nbsp; n & nbsp; ________ 31________ 26 & nbsp; n & nbsp; ________ 33Khớp với phần tử trước của nó ít nhất là & nbsp; n & nbsp; lần.
________ 26 & nbsp; n & nbsp; ________ 35 & nbsp; m & nbsp; ________ 27________ 26 & nbsp; n & nbsp; ________ 35 & nbsp; m & nbsp; ________ 29Khớp với phần tử trước của nó từ & nbsp; n & nbsp; với & nbsp; m & nbsp; thời gian.

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

/^Overview:\s.*$/im
3) để khớp với văn bản trong các trích dẫn (

Array ( [0] => "/" [1] => "Go to homepage" )

Code language: PHP (php)
1):

$str = 'Home'; $pattern = '/".+?"/'; if (preg_match_all($pattern, $str, $matches)) { print_r($matches[0]); }

Code language: HTML, XML (xml)

Output:

Array ( [0] => "/" [1] => "Go to homepage" )

Code language: PHP (php)

Làm thế nào bộ định lượng không màu xanh lá cây (+?) Hoạt động.

Đầu tiên, động cơ Regex tìm kiếm một trận đấu bắt đầu từ vị trí đầu tiên trong chuỗi. Bởi vì động cơ Regex không thể tìm thấy một trận đấu, nó tiếp tục tìm kiếm cho đến khi nó tìm thấy báo giá đầu tiên (

Array ( [0] => "/" [1] => "Go to homepage" )

Code language: PHP (php)
2):

Thứ hai, động cơ Regex tìm thấy một trận đấu cho quy tắc

Array ( [0] => "/" [1] => "Go to homepage" )

Code language: PHP (php)
3.Tuy nhiên, bộ định lượng không tham lam
/^Overview:\s.*$/im
3 chỉ khớp một lần, không nhiều lần đến cuối chuỗi như bộ định lượng tham lam (+).Và động cơ Regex ngay lập tức nhìn vào quy tắc tiếp theo trong mẫu, phù hợp với báo giá (Hồi):one time, not multiple times to the end of the string like the greedy quantifier (+). And the regex engine immediately looks at the next rule in the pattern, which matches a quote (“):

Thứ ba, động cơ Regex lặp lại các bước thứ nhất và thứ hai bắt đầu từ vị trí sau trận đấu đầu tiên và trả về kết quả tiếp theo:

Cuối cùng, động cơ Regex tiếp tục tìm kiếm cho đến khi kết thúc chuỗi:

Bản tóm tắt

  • Chụp 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.
  • Một định lượng không màu xanh lá cây cố gắng phù hợp với yếu tố trước đó càng ít càng tốt.

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