2011-06-25 51 views
5

Phương thức mặc định split trong Python xử lý các khoảng trắng liên tiếp dưới dạng một dấu tách đơn. Nhưng nếu bạn chỉ định một chuỗi delimiter, delimiters liên tiếp là không sụp đổ:Python phân tách các dấu phân tách liên tiếp

>>> 'aaa'.split('a') 
['', '', '', ''] 

cách đơn giản nhất để sụp đổ delimiters liên tiếp là gì? Tôi biết tôi chỉ có thể xóa các chuỗi rỗng khỏi danh sách kết quả:

>>> result = 'aaa'.split('a') 
>>> result 
['', '', '', ''] 
>>> result = [item for item in result if item] 

Nhưng có cách nào tiện lợi hơn không?

+0

Có vẻ như bạn có thể thực hiện điều này bằng 're.split' –

+1

Thú vị! Tôi đã không nhận ra 'split()' mà không có đối số nào đã làm được điều gì đó mà không thể được nhân rộng bằng 'split' với các đối số. – weronika

Trả lời

7

Bạn có thể sử dụng một biểu thức chính quy là dấu phân cách, như trong:

re.split(pattern, string[, maxsplit=0, flags=0]) 

Từ the docs.

2

Bạn có thể sử dụng biểu thức thông thường:

re.split(pattern, string[, maxsplit=0, flags=0]) 

như

re.split('a+', 'aaa') 
+0

[Cú pháp regex của Python] (http://docs.python.org/library/re.html#regular-expression-syntax), nếu cần. –

0

Không, không có cách nào thuận tiện hơn. Hoặc là bạn viết hàm tách riêng của bạn, hoặc xóa các chuỗi rỗng.

Nhưng giải pháp của bạn có vẻ rất rõ ràng và nhiệt tình.

0

Mặc dù nó không phải là chính xác những gì bạn yêu cầu, bạn có thể thoát khỏi tất cả thẻ không độc đáo bằng cách sử dụng một set:

>>> result 
['', '', ''] 
>>> set(result) 
set(['']) 
10

Đây là khoảng càng ngắn gọn càng bạn có thể nhận được:

string = 'aaa' 
result = [s for s in string.split('a') if s] 

Hoặc bạn có thể chuyển sang cụm từ thông dụng:

string = 'aaa' 
result = re.split('a+', string) 
+0

@anonymous downvote: Chăm sóc để giải thích? – orlp

+0

Giải pháp tuyệt vời! Mẫu 'a +' sẽ chia cho 'a' liên tiếp nhất có thể. Do đó, bằng cách chạy 're.split ('a +', string)' nó sẽ trả về '['', '']'. Nói rằng 'string = 'baaac'' thì nó sẽ trả về' [' b ',' c '] '. – DomingoR

1

Tôi nghĩ giải pháp của bạn là pe rfectly OK. Đây là số điện thoại tương đương:

filter(bool, 'aaa'.split('a')) 

Có thể không dễ thấy như danh sách hiểu.

+1

xin lỗi nhưng giải pháp này là khá xấu. Ngoài ra, bộ lọc thay đổi trong python3 và sẽ không có cùng một kết quả –

+0

Bạn có thể giải thích tại sao nó xấu (ngoài hành vi của nó thay đổi trong python 3 mà tôi không biết)? – jena

+0

vì bạn đang thêm lệnh gọi hàm vào bool (overhead) và làm cho nó ít có thể đọc được. –

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