2010-09-14 81 views
31

Tôi có chuỗi lớn mà tôi chia cho các dòng mới. Làm cách nào để xóa tất cả các dòng trống, chỉ (khoảng trắng)?Cách xóa các dòng trống có hoặc không có khoảng trống trong Python

mã giả:

for stuff in largestring: 
    remove stuff that is blank 
+1

[Đối với bản thân mình, tôi thấy câu trả lời ở đây là giải pháp tốt nhất] (http://stackoverflow.com/questions/1140958/whats-a-quick-one-liner-to-remove-empty-dòng-từ-a-python-string # answer-24172715) – Dmitriy

+0

Một lớp lót để xóa các dòng trống (không có khoảng trắng) là [this] (http://stackoverflow.com/a/1140966/2373278). Dòng tiêu đề câu hỏi có thể được thay đổi thành 'Xoá các dòng trống với khoảng trắng chỉ trong python'. – ViFI

Trả lời

36

Sử dụng regex:

if re.match(r'^\s*$', line): 
    # line is empty (has only the following: \t\n\r and whitespace) 

Sử dụng regex + filter():

filtered = filter(lambda x: not re.match(r'^\s*$', x), original) 

Như đã thấy trên codepad.

+1

Cảm ơn tất cả các kết quả, tuy nhiên, giải pháp này là chính xác những gì tôi đã được tìm kiếm! Cảm ơn rất nhiều giải pháp của gimel – user428370

+2

, với việc gia nhập lại văn bản sau đó, mang lại hiệu suất tốt hơn nhiều. Tôi đã so sánh hai giải pháp trên một văn bản nhỏ (10 dòng nếu 3 dòng trống). Dưới đây là kết quả: regex: '1000 vòng, tốt nhất là 3: 452 chúng tôi trên mỗi vòng lặp'; tham gia, chia nhỏ và tách: '100000 vòng, tốt nhất là 3: 5,41 chúng tôi trên mỗi vòng lặp ' – m01

40

danh sách Cố gắng hiểu và string.strip():

>>> mystr = "L1\nL2\n\nL3\nL4\n \n\nL5" 
>>> mystr.split('\n') 
['L1', 'L2', '', 'L3', 'L4', ' ', '', 'L5'] 
>>> [line for line in mystr.split('\n') if line.strip() != ''] 
['L1', 'L2', 'L3', 'L4', 'L5'] 
+4

+1 để hiển thị kết quả trung gian một cách hữu ích. – LarsH

+1

+1 Điều này là khá nhiều chính xác như thế nào tôi giải quyết vấn đề này khi tôi đã có nó. – kindall

+9

bạn có thể rút ngắn nó bằng cách bỏ qua! = '' Chỉ đơn giản là "nếu line.strip()" – javadba

6

Edit: Wow, tôi đoán bỏ qua rõ ràng là không ổn.

lines = bigstring.split() 
lines = [line for line in lines if line.strip()] 
+1

Điều đó sẽ hoạt động với các dòng = ['Line \ n', '\ n', 'Line \ n'] nhưng đầu vào là 'Dòng \ n \ nLine \ n'. –

+2

@Walter: Trên thực tế, nếu bạn đã sử dụng 'Line \ n \ nLine \ n'.split() như bạn nên có, nó sẽ hoạt động tốt. – nmichaels

13

Tôi cũng đã cố gắng regexp và danh sách các giải pháp, và danh sách một trong nhanh hơn.

Đây là giải pháp của tôi (bởi câu trả lời trước):

text = "\n".join([ll.rstrip() for ll in original_text.splitlines() if ll.strip()]) 
4

Nếu bạn không sẵn sàng để thử regex (mà bạn nên), bạn có thể sử dụng này:

s.replace('\n\n','\n') 

Lặp lại vài này thời gian để đảm bảo không còn dòng trống. Hoặc chaining các lệnh:

s.replace('\n\n','\n').replace('\n\n','\n') 
+1

Ví dụ: bạn có thể muốn sử dụng cụm từ thông dụng. "Lặp lại một số dòng để chắc chắn" không phải là một ý tưởng tốt khi bạn đang mã hóa, vì bạn có thể để lại những thứ chưa được giải quyết hoặc lãng phí thời gian chạy một cái gì đó nhiều lần hơn cần thiết. – Enrico

+0

+1 để regex, nhưng như là một hack lười biếng (hoặc nếu nhập khẩu các mô-đun regex là quá chậm), bạn có thể thay thế chuỗi tuyên bố: 's.replace ('\ n \ n', '\ n'). Thay thế (' \ n \ n ',' \ n ') ' Thử nghiệm trên 3.6. –

+0

@evan_b không nghĩ đến chuỗi lệnh. Cái nào sẽ được thực hiện trước? – Ooker

1

phiên bản của tôi:

while '' in all_lines: 
    all_lines.pop(all_lines.index('')) 
-1
while True: 
    try: 
     all_lines.remove('') 
    except ValueError: 
     break 
+1

Vui lòng giải thích cách mã của bạn giải quyết được sự cố –

+0

Điều gì không rõ ràng? – Radren

0

komodo edit remove blank lines

Trong Komodo chỉnh sửa nhấn Ctrl + H sao Mark (Treat như regex), Click vào trên liên kết để xem ảnh chụp nhanh.

0

Tương tự như những gì @NullUserException nói, đây là cách tôi viết nó:

removedWhitespce = re.sub(r'^\s*$', '', line) 
Các vấn đề liên quan