2010-05-20 5 views
130

Comment tronquer une chaîne à 75 caractères en Python?Python tronque une longue chaîne

Voici comment cela se fait en JavaScript:

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

Répondre

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

Je changerais la condition peut-être ' len (data)> 77' pour représenter les doubles points (inutile de tronquer seulement le dernier caractère pour le remplacer par un point). – hasen

+3

@hasenj: Cela ne serait pas conforme au code original, mais c'est une bonne suggestion que j'aurais dû signaler en premier lieu. –

+2

Notez que les parens inclus sont bien sûr facultatifs. –

7

Vous pouvez utiliser ce one-liner:

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

Encore plus concise:

data = data[:75] 

Si il y a moins de 75 caractères, il n'y aura pas de changement.

+5

Vraisemblablement, il veut une ellipse ajoutée si la chaîne est tronquée. – FogleBird

+2

Vous avez raison - je n'ai jamais remarqué ça. Je ne peux pas penser à une meilleure façon de le faire que d'autres réponses. – neil

86

encore plus court:

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

Approche amusante pour le faire. Bien que ce soit encore un one-liner composite. ^^ – Cheery

+1

cette solution n'a pas 77 caractères si vous incluez le '..'? –

+1

@MarkChackerian: Oui, selon le code d'origine. –

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

S'il vous plaît expliquer votre réponse? – Gwenc37

+0

exemple similaire de cette fonction DEF Info2 (données): si len (données)> 10: données de retour [10] + '...' autre: données de retour instruction lambda de la conception sans nom dans un style fonctionnel ex = lambda x: x + 1 def ex (x): return x + 1 – Spouk

5

Avec regex:

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

Les chaînes longues sont tronquées:

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

cordes Shorter ne sont tronqués:

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

De cette façon, vous pouvez aussi « couper » la partie centrale de la chaîne, ce qui est plus agréable dans certains cas:

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

bien qui n'a pas fonctionné lorsque vous avez des espaces dans votre chaîne – holms

+0

@holms ça marche pour moi! :) http://pastebin.com/28DR9xzL –

+0

Pourquoi utiliseriez-vous regex pour un cas aussi simple? – boramalper

0

Vous ne pouvez pas réellement « tronquer » une chaîne Python comme vous pouvez faire une chaîne C allouée dynamiquement. Les chaînes en Python sont immuables. Ce que vous pouvez faire est de couper une chaîne comme décrit dans les autres réponses, ce qui donne une nouvelle chaîne contenant uniquement les caractères définis par les offsets de tranche et l'étape. Dans certains cas (non pratiques), cela peut être un peu ennuyeux, par exemple lorsque vous choisissez Python comme langue d'interview et que l'intervieweur vous demande de supprimer les caractères en double d'une chaîne sur place. Doh.

2

Encore une autre solution. Avec True et False vous obtenez un peu de retour sur le test à la fin.

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

Il n'y a pas besoin d'une expression régulière, mais vous ne voulez utiliser le formatage de chaîne plutôt que la concaténation de chaîne dans la réponse acceptée.

Ceci est probablement la façon la plus canonique, Pythonique de tronquer la chaîne data à 75 caractères.

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

J'ai trouvé amusant que votre chaîne 'saddddddd ...' se transforme en '111111 ...' :) Je sais que c'est une faute de frappe, et je suis d'accord avec vous sur les expressions régulières. – akarilimano

2

Cette méthode n'utilise pas si:

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

+1

Je l'ai écrit seulement pour montrer que c'est possible. C'est contre la philosophie de lisibilité de python. Il n'a aucun avantage de performance par rapport à d'autres méthodes "si". Je ne l'utilise jamais et je ne suggère pas que vous l'utilisiez aussi. – Sassan

37

Si vous utilisez Python 3.4+, vous pouvez utiliser textwrap.shorten de la bibliothèque standard:

Collapse et tronque le texte donné pour l'adapter à la largeur donnée.

Tout d'abord, l'espace dans le texte est réduit (tout espace est remplacé par par des espaces simples). Si le résultat correspond à la largeur, il est renvoyé. Sinon, assez de mots sont supprimés de la fin afin que les mots restants ainsi que l'ajustement de l'espace réservé dans la largeur:

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

Il semblerait que son pantalon soit vraiment très long (pas d'espace) et n'émette que l'ellipse. – elBradford

+2

@elBradford (et autres personnes intéressées): c'est parce que 'shorten()' tronque * les mots *, pas les caractères simples. J'ai cherché mais il ne semble pas y avoir moyen de configurer 'shorten()' ou une instance 'TextWrapper' pour couper des caractères simples et non des mots. – none

+0

Et il a l'effet secondaire ennuyeux d'enlever des sauts de ligne – havlock

1

Ce juste:

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... 
Questions connexes