2011-09-09 41 views
5

Nếu tôi có một chuỗi lớn với nhiều dòng và tôi muốn khớp một phần của một dòng chỉ với dòng đó, cách tốt nhất là gì Để làm việc đó?khớp một phần của chuỗi cho đến khi nó đến cuối dòng (python regex)

Vì vậy, ví dụ tôi có một cái gì đó như thế này và tôi muốn nó ngừng phù hợp khi nó đạt đến ký tự dòng mới.

r"(?P<name>[A-Za-z\s.]+)" 

Tôi thấy điều này trong một previous answer:

$ - Chỉ phù hợp để kết thúc chuỗi, hoặc kết thúc của một dòng nếu multiline được kích hoạt.

Câu hỏi của tôi là làm cách nào để bạn "bật nhiều dòng" làm tác giả của câu trả lời đó?

Trả lời

8

Đơn giản chỉ cần sử dụng

r"(?P<name>[A-Za-z\t .]+)" 

này sẽ phù hợp kí tự ASCII, không gian, tab hoặc giai đoạn. Nó sẽ dừng lại ở ký tự đầu tiên không được bao gồm trong nhóm - và các dòng mới không (trong khi đó được bao gồm trong \s và do đó không liên quan đến chế độ đa cấp được bật hay tắt)

1

Nhìn vào thông số flags tại http://docs.python.org/library/re.html#module-contents

+0

Điều này không hữu ích - cho phép chế độ nhiều dòng sẽ không giải quyết được sự cố của anh ấy. –

+0

Chỉ cần trả lời câu hỏi của anh ấy làm thế nào để kích hoạt multiline ... – rocksportrocker

+1

Phải, và nếu ai đó hỏi bạn nếu anh ta nên giữ búa của mình lên hoặc xuống để lái xe trong một ốc vít, bạn sẽ không nói cho anh ta để sử dụng một tuốc nơ vít thay vì :) –

2

Bạn có thể bật phù hợp với nhiều dòng bằng cách thông qua re.MULTILINE như là đối số thứ hai để re.compile(). Tuy nhiên, có một sự tinh tế để xem ra: vì số phân tích + tham lam, biểu thức chính quy này sẽ khớp với chuỗi dài nhất có thể, vì vậy nếu dòng tiếp theo được tạo thành từ các chữ cái và khoảng trống, thì regex có thể khớp nhiều hơn một dòng ($ khớp với kết thúc của bất kỳ số nào chuỗi).

Có ba giải pháp này:

  1. Thay đổi regex của bạn do đó, thay vì phù hợp với bất kỳ khoảng trắng bao gồm newline (\s) bộ ký tự lặp đi lặp lại của bạn không phù hợp xuống dòng đó.
  2. Thay đổi định lượng thành +?, phiên bản không tham lam ("tối thiểu") +, để nó khớp với chuỗi ngắn nhất có thể và do đó dừng lại ở dòng mới đầu tiên.
  3. Thay đổi mã của bạn để lần đầu tiên chia văn bản thành một chuỗi riêng cho mỗi dòng (sử dụng text.split('\n').
+0

Cảm ơn cho các giải pháp! Người đầu tiên nghe dễ nhất để thực hiện. Bạn có biết cụ thể làm thế nào tôi có thể chỉ định tôi chỉ muốn không gian duy nhất để được so khớp như trái ngược với bất kỳ khoảng trắng? Tôi đã thử giải pháp thứ hai nhưng nó chỉ phù hợp với một nhân vật duy nhất. –

+1

Của tôi xấu, nên đã đề cập - cho tất cả các giải pháp này, bạn cũng nên bao gồm '$' (cuối chuỗi) neo ở cuối.Bằng cách đó, với giải pháp 2, 're' sẽ tìm chuỗi ngắn nhất phù hợp với regex * và * đi đến cuối dòng, đó là những gì bạn muốn. Đối với giải pháp 1, một khoảng trắng có thể được biểu diễn trong một ký tự được đặt bởi một khoảng trắng - không yêu cầu thoát (tức là '[A-Za-z.]') – azernik

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