2010-05-20 16 views
130

¿Cómo se trunca una cadena de 75 caracteres en Python?Python truncar una cadena larga

Ésta es la forma en que se lleva a cabo en JavaScript:

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

Respuesta

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

que cambiaría la condición quizá a ' len (data)> 77' para dar cuenta de los puntos dobles (no tiene sentido truncar solo el último carácter solo para reemplazarlo por un punto). – hasen

+3

@hasenj: Eso no se ajustaría al código original, pero es una buena sugerencia que debería haber señalado en primer lugar. –

+2

Tenga en cuenta que los parens incluidos son, por supuesto, opcionales. –

7

Usted podría utilizar esta sola línea:

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

Aún más concisa:

data = data[:75] 

Si es menos de 75 caracteres, no habrá cambios.

+5

Es de suponer que quiere una elipsis adjunta si la cadena se trunca. – FogleBird

+2

Tienes razón, nunca lo noté. No puedo pensar en una mejor manera de hacer eso que otras respuestas. – neil

86

aún más corto:

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

enfoque divertido para hacerlo. Aunque sigue siendo un compuesto de una sola línea. ^^ – Cheery

+1

¿esta solución no tiene 77 caracteres si incluye el '..'? –

+1

@MarkChackerian: Sí, según el código original. –

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

Por favor explique su respuesta? – Gwenc37

+0

ejemplo similar de esta función info2 def (datos): si len (datos)> 10: datos de retorno [10] + '...' otra cosa: datos de retorno instrucción lambda del diseño sin nombre con un estilo funcional ex = lambda x: x + 1 def ex (x): retorno x + 1 – Spouk

5

Con expresiones regulares:

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

cadenas largas se truncan:

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

Shorter cuerdas nunca se trunca:

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

De esta manera, también puede "cortar" la parte media de la cadena, lo que es más agradable en algunos casos:

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

así que no trabaja cuando tiene espacios en la cadena de – holms

+0

@holms funciona para mí! :) http://pastebin.com/28DR9xzL –

+0

¿Por qué usarías Regex para un caso tan simple? – boramalper

0

Usted puede en realidad no "truncar" una cadena de Python como se hace hacer una cadena C dinámicamente asignada. Las cadenas en Python son inmutables. Lo que puede hacer es cortar una cadena como se describe en otras respuestas, produciendo una nueva cadena que contiene solo los caracteres definidos por los desplazamientos de corte y el paso. En algunos casos (no prácticos) esto puede ser un poco molesto, como cuando elige Python como el idioma de su entrevista y el entrevistador le pide que elimine los caracteres duplicados de una cadena en el lugar. Doh.

2

Otra solución más. Con True y False obtendrá un pequeño comentario sobre la prueba al final.

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

No hay necesidad de una expresión regular, pero sí desea utilizar el formato de cadena en lugar de la concatenación de cadenas en la respuesta aceptada.

Esta es probablemente la forma más canónica y tricónica de truncar la cadena data a 75 caracteres.

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

Me pareció gracioso cómo su cadena 'saddddddd ...' se convierte en '111111 ...' :) Sé que es un error de copiar y pegar, y estoy de acuerdo con usted acerca de las expresiones regulares. – akarilimano

2

Este método no utiliza ningún tipo si:

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

+1

Lo escribí solo para mostrar que es posible. Va en contra de la filosofía de legibilidad de Python. No tiene ninguna ventaja de rendimiento en comparación con otros métodos basados ​​en "si". Nunca lo uso y no sugiero que lo uses también. – Sassan

37

Si está utilizando Python 3.4+, puede utilizar textwrap.shorten de la librería estándar:

colapso y truncar el texto dado para caber en el ancho dado.

Primero, el espacio en blanco en el texto se contrae (todos los espacios en blanco se reemplazan por por espacios simples). Si el resultado se ajusta al ancho, se devuelve. De lo contrario, suficientes palabras se lanzan desde el final para que los palabras restantes, más el ajuste marcador de posición dentro del ancho:

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

Parece que se caga en pantalones en cuerdas realmente largas (sin espacios) y solo produce puntos suspensivos. – elBradford

+2

@elBradford (y otros interesados): eso es porque 'shorten()' trunca * words *, no solo caracteres. Busqué pero no parece una forma de configurar 'shorten()' o una instancia 'TextWrapper' para cortar caracteres individuales y no palabras. – none

+0

Y tiene el molesto efecto secundario de eliminar saltos de línea – havlock

1

Esto acaba de llegar:

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... 
Cuestiones relacionadas