Python截断一个长字符串

Hul*_*ulk 208 python

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

这是在JavaScript中完成的:

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

Mar*_*tos 375

info = (data[:75] + '..') if len(data) > 75 else data
Run Code Online (Sandbox Code Playgroud)

  • 我可能会将条件改为`len(data)> 77`来解释双点(对于截断只有最后一个字符只能用点替换它是没有意义的). (49认同)
  • @TaylorEdmiston是的,但对于那些不记得他们每天使用的5-10种语言中的所有优先规则的人来说,它们非常有帮助. (7认同)
  • @hasenj:这不符合原始代码,但这是一个很好的建议,我应该首先指出. (4认同)
  • 请注意,包含的parens当然是可选的. (2认同)
  • @安东尼一片 (2认同)
  • @hasen,或者如果问题的目的是生成一个适合 75 个字符的字符串(javascript 不这样做,但也许应该这样做),则将切片更改为 [:73] 。 (2认同)

小智 120

更短:

info = data[:75] + (data[75:] and '..')
Run Code Online (Sandbox Code Playgroud)

  • 当然,很好的原始答案,但马塞洛的答案更好,因为它更明确,因此更具可读性(因此Pythonic)。 (3认同)
  • 有趣的方法。尽管它仍然是一种复合材料。^^ (2认同)
  • 如果包含“ ..”,此解决方案是否不包含77个字符? (2认同)
  • 这不是执行两个切片操作吗?我想知道当性能至关重要时,与 /sf/answers/3659554321/ 相比,它的性能如何 (2认同)

nei*_*eil 95

更简洁:

data = data[:75]
Run Code Online (Sandbox Code Playgroud)

如果它少于75个字符,则不会有任何变化.

  • 据推测,如果字符串被截断,他想要附加省略号. (8认同)
  • 你是对的 - 我从来没有注意到这一点.我想不出比其他答案更好的方法. (3认同)

Bor*_*per 70

如果您使用的是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...'
Run Code Online (Sandbox Code Playgroud)

  • 它似乎把裤子扯在很长的琴弦上(没有空格),只输出省略号. (7认同)
  • @elBradford(和其他感兴趣的人):那是因为`shorten()`截断*单词*,而不是单个字符.我搜索但似乎没有办法配置`shorten()`或`TextWrapper`实例来剪辑单个字符而不是单词. (3认同)
  • 这并不能解决 OP 的问题。它按单词截断,甚至删除空格。 (3认同)
  • 它具有去除换行符的恼人副作用 (2认同)

Ris*_*nha 27

对于Django解决方案(问题中未提及):

from django.utils.text import Truncator
value = Truncator(value).chars(75)
Run Code Online (Sandbox Code Playgroud)

看看Truncator的源代码来理解这个问题:https: //github.com/django/django/blob/master/django/utils/text.py#L66

关于使用Django截断: Django HTML截断

  • 这不必要地将低级逻辑耦合到 django。不会推荐它。 (2认同)

pho*_*x24 9

你可以使用这个单线程:

data = (data[:75] + '..') if len(data) > 75 else data
Run Code Online (Sandbox Code Playgroud)

  • 什么是`[:n]` 以便我可以在文档中查找它? (2认同)
  • 切片:/sf/ask/35644801/ (2认同)

Dav*_*rri 8

正则表达式:

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

长字符串被截断:

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

较短的字符串永远不会被截断:

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

这样,你也可以"剪切"字符串的中间部分,在某些情况下更好:

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

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


dan*_*lmo 6

这只是在:

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...
Run Code Online (Sandbox Code Playgroud)

  • 之前的所有答案都忽略了OP真正想要的东西——输出字符串不超过75个字符。感谢您理解“不要照我说的做,做我想做的”编程原则。为了完整起见,您可以通过附加以下内容来修复 n&lt;3 的极端情况: if n &gt; 2 else s[:n] (2认同)

Hel*_*bye 6

info = data[:75] + ('..' if len(data) > 75 else '')
Run Code Online (Sandbox Code Playgroud)


Sas*_*san 5

如果满足以下条件,则此方法不使用任何方法:

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

  • 我写它只是为了表明它是可能的。这违反了python的可读性哲学。与其他基于“ if”的方法相比,它没有任何性能优势。我从不使用它,也不建议您也使用它。 (3认同)

Hel*_*bye 5

limit = 75
info = data[:limit] + '..' * (len(data) > limit)
Run Code Online (Sandbox Code Playgroud)


小智 5

info = data[:min(len(data), 75)
Run Code Online (Sandbox Code Playgroud)

  • 应该是 `info = data[:min(len(data), 75)]` 最后一个 `]` 丢失 (5认同)
  • 仅代码答案通常被认为是低质量的。您能否为您的答案添加解释。 (3认同)