2010-04-12 69 views
9

我想以類似.split()(因此產生一個列表)的方式拆分字符串,但以更聰明的方式:我希望它分割成塊是最多15個字符,但不分裂中期詞這樣:分割使用空格分隔符和最大長度的字符串

string = 'A string with words' 

[splitting process takes place] 

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

在這個例子中的字符串「與」和「字」,因爲這是你可以把它分解的最後的地方和第一之間的分裂位爲15個字符或更少。

+2

如何處理超過15個字符的單詞? – SilentGhost 2010-04-12 14:01:12

+0

字符串編輯嚴重,所以我可以確保編輯器永遠不會使用超過15個字符的單詞 – chrism 2010-04-12 14:14:37

回答

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

簡單和工作,它蜱所有的箱子! – chrism 2010-04-12 14:25:19

+0

最好的部分是該軟件包通常已經在 – 2014-06-23 19:07:09

1

您可能正在尋找使用正則表達式。 Python re模塊具有split函數,但我認爲通過簡單匹配組可以更好地服務。

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

[編輯]抱歉,錯過了你想要多個塊的地方。我打算在這裏放一個更復雜的正則表達式,但上面引用的textwrap模塊就是爲此而做的。如果你願意的話,我會離開擴展正則表達式作爲練習。

+0

我喜歡這樣,因爲它不會分解或丟失超過15個字符的單詞,這是基於我非常有限的測試。 – 2010-04-12 14:09:51

6

你可以這樣做兩種不同的方式:

>>> 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'] 

注意,在空間處理上的微小差異。

+0

這兩種好的可能性,但要注意的是,它們都不能處理長度超過15個字符的單詞。>>> >>> s ='帶有超級文字級單詞的字符串' >>> textwrap。 (s,15) ['s with s','upercalifragili','stic words'] >>> re.findall(r'\ b。{1,15} \ b',s) [ '帶有','字'的字符串] ' – 2010-04-12 14:10:50

+1

定義「非常好」。如果你正在包裝文本,並且一個單詞的長度超過了終端的寬度,那麼你非常希望將這個單詞分割爲終端寬度的塊,因爲這個寬度是一個硬限制。 – jemfinch 2010-04-12 14:13:28