Python截断一个长string

如何在Python中将string截断为75个字符?

这是如何在JavaScript中完成的:

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

更短:

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

更简洁:

 data = data[:75] 

如果less于75个字符,则不会有变化。

如果您使用的是Python 3.4+,则可以使用标准库中的textwrap.shorten

折叠并截断给定的文本以适应给定的宽度。

首先,文本中的空格被折叠(所有的空格被单个空格replace)。 如果结果符合宽度,则返回。 否则,从结尾删除足够的单词,以便余下的单词加上占位符适合宽度:

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

对于Django解决scheme(在问题中没有提到):

 from django.utils.text import Truncator value = Truncator(value).chars(75) 

看看截断者的源代码来欣赏这个问题: https : //github.com/django/django/blob/master/django/utils/text.py#L66

关于用Django截断: Django HTML截断

你可以使用这一行:

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

用正则expression式:

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

长的string被截断:

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

更短的string永远不会被截断:

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

这样,您也可以“切”string的中间部分,在某些情况下更好:

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

又一个解决scheme。 用TrueFalse你会在最后得到关于testing的一些反馈。

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

这种方法不使用任何如果:

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

这只是:

 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 = '123456789012345' print s[:n-3] + (s[n-3:], '...')[len(s) > n] 123 12345678 12345... 12345... 
  >>> info = lambda data: len(data)>10 and data[:10]+'...' or data >>> info('sdfsdfsdfsdfsdfsdfsdfsdfsdfsdfsdf') 'sdfsdfsdfs...' >>> info('sdfsdf') 'sdfsdf' >>> 

你不能真正地“截断”一个Pythonstring,就像你可以做一个dynamic分配的Cstring一样。 Python中的string是不可改变的。 你可以做的是按照其他答案中描述的那样分割一个string,产生一个只包含由偏移量和步长定义的字符的新string。 在一些(非实际)的情况下,这可能会有些恼人,比如当你selectPython作为你的面试语言,面试官要求你在原地删除重复的字符。 卫生署。

没有必要使用正则expression式,但是您希望在接受的答案中使用string格式而不是string连接。

这可能是在75个字符处截断stringdata的最经典的Pythonic方式。

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