2013-03-22 25 views
5

Tôi muốn tìm một cụm từ, khớp với một vài từ theo sau, nhưng dừng sớm nếu tôi tìm một cụm từ cụ thể khác.Cụm từ thông dụng: Khớp với một từ hoặc số từ tối đa

Ví dụ: tôi muốn khớp tối đa ba từ sau "đi tới", nhưng dừng quá trình đối sánh nếu tôi gặp "để thử". Vì vậy, ví dụ "đi đến công viên luna" sẽ dẫn đến "công viên luna"; "đi đến thủ đô của Peru" sẽ kết quả với "thành phố thủ đô" và "đi đến mặt trăng để thử một số bánh pho mát" sẽ kết quả với "mặt trăng".

Có thể thực hiện bằng một biểu thức chính quy đơn giản, đơn giản (tốt nhất là bằng Python) không? Tôi đã thử tất cả các kết hợp tôi có thể nghĩ đến, nhưng thất bại thảm hại :).

+2

Hãy cho chúng tôi thấy bạn nỗ lực thành công nhất. – NPE

+0

Chỉ cần cho vui ở đây là một giải pháp không regex: ''' .join (text.split ('đi đến') [1] .split ('to try') [0] .split() [: 3]) ' – jamylak

Trả lời

5

Cái này phù hợp lên đến 3 ({1,3}) những lời sau đây going to the miễn là họ không được tiếp theo để thử ((?!to try)):

import re 
infile = open("input", "r") 
for line in infile: 
    m = re.match("going to the ((?:\w+\s*(?!to try)){1,3})", line) 
    if m: 
     print m.group(1).rstrip() 

Output

luna park 
capital city of 
moon 
+0

Thay đổi nó để đi đến – jamylak

+0

Tại sao nó hoạt động với "đi đến mặt trăng đẹp tuyệt vời để thử bánh pho mát" và trở về "mặt trăng đẹp tuyệt vời"? Tôi đã mong đợi "mặt trăng" để không phù hợp, bởi vì nó được theo sau bởi "để thử" ... – EOL

+2

@EOL Xem xét "đi đến mặt trăng để thử ...": '" moon "' được theo sau bởi 'để thử' và thất bại cái nhìn. Động cơ backtracks một không gian và sau đó có một trận đấu. Bây giờ ký tự tiếp theo là không gian và nó không khớp với '\ w', do đó bạn không nhận được từ thứ hai. –

-2

Tôi nghĩ rằng bạn đang tìm kiếm một cách để trích xuất Danh từ riêng ra khỏi câu. Bạn nên xem NLTK để có cách tiếp cận phù hợp. Regex có thể chỉ hữu ích trong ngữ cảnh ngữ cảnh giới hạn miễn phí. Mặt khác, bạn dường như yêu cầu khả năng phân tích ngôn ngữ của con người mà không tầm thường (đối với máy tính).

+1

không phải là câu hỏi – jamylak

+2

Nếu có, có thể phù hợp hơn làm nhận xét. – Dukeling

Các vấn đề liên quan