Python обрезать длинную строку - PullRequest
191 голосов
/ 20 мая 2010

Как обрезать строку до 75 символов в Python?

Вот как это делается в JavaScript:

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

Ответы [ 16 ]

343 голосов
/ 20 мая 2010
info = (data[:75] + '..') if len(data) > 75 else data
109 голосов
/ 20 мая 2010

Еще короче:

info = data[:75] + (data[75:] and '..')
83 голосов
/ 20 мая 2010

Еще более кратко:

data = data[:75]

Если оно меньше 75 символов, изменений не будет.

60 голосов
/ 18 августа 2016

Если вы используете 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...'
26 голосов
/ 25 января 2016

Для решения Django (которое не упоминалось в вопросе):

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

Взгляните на исходный код Truncator, чтобы оценить проблему: https://github.com/django/django/blob/master/django/utils/text.py#L66

По поводу усечения с Джанго: усечение Django HTML

9 голосов
/ 20 мая 2010

Вы можете использовать этот однострочник:

data = (data[:75] + '..') if len(data) > 75 else data
7 голосов
/ 05 июня 2014

с регулярным выражением:

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'
4 голосов
/ 31 июля 2016

Этот метод не использует, если:

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

3 голосов
/ 11 сентября 2018
limit = 75
info = data[:limit] + '..' * (len(data) > limit)
3 голосов
/ 10 марта 2016

Еще одно решение. С True и False вы получите небольшой отзыв о тесте в конце.

data = {True: data[:75] + '..', False: data}[len(data) > 75]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...