2010-04-08 31 views
8

Tôi đang cố gắng chia chuỗi trên ký tự dòng mới (phục vụ cho các ký tự dòng mới của Windows, OS X và Unix). Nếu có bất kỳ sự kế thừa nào trong số này, tôi cũng muốn chia nhỏ số đó và không bao gồm bất kỳ kết quả nào trong số.Regex để phân chia thành công của các ký tự dòng mới

Vì vậy, khi chia như sau:

"Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix" 

kết quả

Các sẽ là:

['Foo', 'Double Windows', 'Double OS X', 'Double Unix', 'Windows', 'OS X', 'Unix'] 

tôi nên sử dụng regex gì?

+3

Bạn có lo ngại về khoảng trắng dọc khác? \ r \ n là DOS, nhưng vẫn còn các khoảng trắng dọc khác như tab dọc và Unicode NBSP, PS, LS, NNBSP. Bạn có thể muốn kiểm tra xem Python có hỗ trợ khái niệm về newline chung hay không. Perl có \ v và \ R phù hợp với bất kỳ khoảng trắng dọc hoặc linefeed chung nào tương ứng. Nếu không, nếu bạn muốn các ký tự Unicode, hãy thêm chúng vào các lớp ký tự của bạn [\ r \ n] + và tương đương với Python để tìm kiếm các ký tự Unicode đó. – dawg

Trả lời

3
re.split(r'[\n\r]+', line) 
6

Các mô hình đơn giản nhất cho mục đích này là r'[\r\n]+' mà bạn có thể phát âm như "một hoặc nhiều chuyên chở-trả lại hoặc ký tự xuống dòng".

+0

Yup. Điều đó hoạt động. – dawg

1
>>> s="Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix" 
>>> import re 
>>> re.split("[\r\n]+",s) 
['Foo', 'Double Windows', 'Double OS X', 'Double Unix', 'Windows', 'OS X', 'Unix'] 
20

Nếu không có dấu cách ở đầu hoặc cuối dòng, bạn có thể sử dụng line.split() không có đối số. Nó sẽ loại bỏ gấp đôi. . Nếu không, bạn có thể sử dụng [a for a a.split("\r\n") if a].

CHỈNH SỬA: loại str cũng có phương thức được gọi là "đường tách".

"Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix".splitlines()

+4

+1 cho đường tách –

0

Chú ý đến các quy tắc tham lam cho các mẫu:

pattern = re.compile(r'(\r\n){2,}|(\n\r){2,}|(\r){2,}|(\n){2,}') 
paragraphs = pattern.split(text) 
Các vấn đề liên quan