2010-05-20 172 views
130

如何在Python中將字符串截斷爲75個字符?Python截斷長字符串

這是它是如何在JavaScript中完成的:

var data="saddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsaddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsadddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" 
var info = (data.length > 75) ? data.substring[0,75] + '..' : data; 

回答

238
info = (data[:75] + '..') if len(data) > 75 else data 
+32

我或許會改變的條件' len(data)> 77'來說明雙點(對於只用最後一個字符來截取點來代替它是沒有意義的)。 – hasen 2013-05-13 03:49:40

+3

@hasenj:那不符合最初的代碼,但是這是一個很好的建議,我應該首先指出。 – 2013-05-14 00:23:01

+2

請注意,包含的parens當然是可選的。 – 2016-11-24 02:20:25

7

您可以使用此一班輪:

data = (data[:75] + '..') if len(data) > 75 else data 
61

更簡潔:

data = data[:75] 

如果它少於75個字符將不會有變化。

+5

假設字符串被截斷,他想要附加一個省略號。 – FogleBird 2010-05-20 13:41:07

+2

你是對的 - 我從來沒有注意到這一點。我想不出比其他答案更好的辦法。 – neil 2010-05-20 14:00:22

86

更短:

info = data[:75] + (data[75:] and '..') 
+0

有趣的做法。雖然它仍然是一個複合單線。 ^^ – Cheery 2010-05-20 15:44:14

+1

如果包含'..',這個解決方案是否有77個字符? – 2011-10-18 16:21:50

+1

@MarkChackerian:是的,根據原始代碼。 – 2012-08-20 23:52:35

0
 >>> info = lambda data: len(data)>10 and data[:10]+'...' or data 
     >>> info('sdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdf') 
      'sdfsdfsdfs...' 
     >>> info('sdfsdf') 
      'sdfsdf' 
     >>> 
+1

請解釋你的答案? – Gwenc37 2014-05-07 14:28:49

+0

類似此功能 DEF INFO2的例子(數據): 如果LEN(數據)> 10: 返回數據[10] + '...' 否則: 返回數據 無名設計的 拉姆達指令以多功能風格 EX =拉姆達X:X + 1個 高清EX(X): 返回X + 1 – Spouk 2014-05-07 19:48:17

5

用正則表達式:

re.sub(r'^(.{75}).*$', '\g<1>...', data) 

長字符串被截斷:

>>> data="11111111112222222222333333333344444444445555555555666666666677777777778888888888" 
>>> re.sub(r'^(.{75}).*$', '\g<1>...', data) 
'111111111122222222223333333333444444444455555555556666666666777777777788888...' 

較短的字符串永遠不會被截斷:

>>> data="11111111112222222222333333" 
>>> re.sub(r'^(.{75}).*$', '\g<1>...', data) 
'11111111112222222222333333' 

這樣,你也可以「切割」的字符串,這在某些情況下,更好的中間部分:

re.sub(r'^(.{5}).*(.{5})$', '\g<1>...\g<2>', data) 

>>> data="11111111112222222222333333333344444444445555555555666666666677777777778888888888" 
>>> re.sub(r'^(.{5}).*(.{5})$', '\g<1>...\g<2>', data) 
'11111...88888' 
+0

以及當你在你的字符串有空間,沒有工作 – holms 2015-10-19 01:01:11

+0

@holms它爲我的作品! :) http://pastebin.com/28DR9xzL – 2016-07-25 08:36:51

+0

爲什麼你會使用正則表達式來處理這樣一個簡單的情況? – boramalper 2016-08-18 12:14:15

0

你不能真正「截斷」像你這樣的Python字符串可以做一個動態分配的C字符串。 Python中的字符串是不可變的。你可以做的是切分一個字符串,如其他答案中所述,產生一個新的字符串,只包含切片偏移和步驟定義的字符。 在某些(非實際的)情況下,這可能會有點煩人,例如當您選擇Python作爲面試語言並且面試官要求您在原地刪除字符串中的重複字符時。衛生署。

2

又一種解決方案。通過TrueFalse,您最終會對測試有所反饋。

data = {True: data[:75] + '..', False: data}[len(data) > 75] 
0

沒有必要使用正則表達式,但你希望使用字符串格式化而不是接受的答案字符串連接。

這可能是最規範的Pythonic方法,在75個字符處截斷字符串data

>>> data = "saddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsaddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddsadddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" 
>>> info = "{}..".format(data[:75]) if len(data) > 75 else data 
>>> info 
'111111111122222222223333333333444444444455555555556666666666777777777788888...' 
+0

我發現你的'saddddddd ...'字符串變成了'111111 ...':)我發現它很有趣我知道這是一個複製粘貼的錯字,我同意你關於正則表達式。 – akarilimano 2018-01-29 08:46:45

2

這種方法不使用任何如:

data[:75] + bool(data[75:]) * '..'

+1

我寫它只是爲了表明它是可能的。這違背了python的可讀性哲學。與其他「if」方法相比,它沒有任何性能優勢。我從不使用它,我也不建議你使用它。 – Sassan 2016-08-23 09:19:32

37

如果您正在使用Python 3.4+,您可以使用標準庫中textwrap.shorten

摺疊和截斷給定的文本以適應給定的寬度。

首先文本中的空白被摺疊(所有的空格被單個空格替換爲 )。如果結果符合寬度,則返回。 否則,足夠的字從年底下降使剩餘 話加上寬度內的佔位符合:

>>> textwrap.shorten("Hello world!", width=12) 
'Hello world!' 
>>> textwrap.shorten("Hello world!", width=11) 
'Hello [...]' 
>>> textwrap.shorten("Hello world", width=10, placeholder="...") 
'Hello...' 
+2

它似乎把褲子放在很長的字符串上(沒有空格),只輸出省略號。 – elBradford 2017-07-26 19:46:51

+2

@elBradford(和其他感興趣的人):這是因爲'縮短()'截斷*單詞*,而不是單個字符。我搜索了,但似乎沒有辦法配置'shorten()'或'TextWrapper'實例來剪輯單個字符而不是單詞。 – none 2017-09-10 14:51:44

+0

它具有消除換行符的煩惱副作用 – havlock 2017-12-07 17:05:29

1

這只是:

n = 8 
s = '123' 
print s[:n-3] + (s[n-3:], '...')[len(s) > n] 
s = '12345678' 
print s[:n-3] + (s[n-3:], '...')[len(s) > n] 
s = '123456789'  
print s[:n-3] + (s[n-3:], '...')[len(s) > n] 
s = '123456789' 
print s[:n-3] + (s[n-3:], '...')[len(s) > n] 

123 
12345678 
12345... 
12345...