2010-04-12 35 views
9

Tôi muốn tách một chuỗi theo cách tương tự thành .split() (do đó dẫn đến danh sách) nhưng theo cách thông minh hơn: Tôi muốn chia nó thành khối đó là lên đến 15 ký tự, nhưng không được chia từ giữa vậy:Tách chuỗi bằng cách sử dụng dấu cách cách nhau và độ dài tối đa

string = 'A string with words' 

[splitting process takes place] 

list = ('A string with','words') 

chuỗi trong ví dụ này được phân chia giữa 'với' và 'lời' bởi vì đó là nơi cuối cùng bạn có thể chia nó và là người đầu tiên bit có 15 ký tự trở xuống.

+2

phải làm gì với các từ dài hơn 15 ký tự? – SilentGhost

+0

Chuỗi được chỉnh sửa rất nhiều, vì vậy tôi có thể đảm bảo trình chỉnh sửa không bao giờ sử dụng các từ dài hơn 15 ký tự – chrism

Trả lời

27
>>> import textwrap 
>>> string = 'A string with words' 
>>> textwrap.wrap(string,15) 
['A string with', 'words'] 
+0

Rất đơn giản và hoạt động mà đánh dấu tất cả các ô của tôi! – chrism

+0

Và phần tốt nhất là các gói nói chung đã có trong –

1

Có thể bạn đang tìm cách sử dụng regex. Mô-đun python re có chức năng split, nhưng tôi nghĩ bạn sẽ được phục vụ tốt hơn bằng cách kết hợp các nhóm đơn giản.

>>> re.findall(r'(.{,15})\s(.*$)', 'A string wth words') 
[('A string wth', 'words')] 

[Chỉnh sửa] xin lỗi, đã bỏ lỡ điểm bạn muốn nhiều khối. Tôi sẽ đặt một regex phức tạp hơn ở đây, nhưng mô-đun textwrap được trích dẫn ở trên được thực hiện cho việc này. Tôi sẽ để mở rộng regex như một bài tập cho bạn nếu bạn chọn.

+0

Tôi thích điều này vì nó không chia nhỏ hoặc mất từ ​​dài hơn 15 ký tự, dựa trên thử nghiệm rất hạn chế của tôi. –

6

Bạn có thể làm hai cách khác nhau này:

>>> import re, textwrap 
>>> s = 'A string with words' 
>>> textwrap.wrap(s, 15) 
['A string with', 'words'] 
>>> re.findall(r'\b.{1,15}\b', s) 
['A string with ', 'words'] 

Lưu ý sự khác biệt nhỏ trong việc xử lý không gian.

+0

Cả hai khả năng tốt, nhưng lưu ý rằng không xử lý các từ dài hơn 15 ký tự rất tốt '>>> s = 'Một chuỗi với các từ supercalifragilistic' >>> textwrap. wrap (s, 15) ['Một chuỗi với s', 'upercalifragili', 'từ stic'] >>> re.findall (r '\ b. {1,15} \ b', s) [ 'Chuỗi có', 'từ'] ' –

+1

Xác định" rất tốt ". Nếu bạn đang gói văn bản và một từ dài hơn chiều rộng của thiết bị đầu cuối của bạn, bạn rất muốn chia từ đó thành các phần chiều rộng của thiết bị đầu cuối của bạn, bởi vì chiều rộng đó là một giới hạn cứng. – jemfinch

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