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。 用True
和False
你会在最后得到关于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...'