2009-05-24 17 views

Respuesta

118

Split, en el separador de como máximo una vez, y tomar la primera pieza :

sep = '...' 
rest = text.split(sep, 1)[0] 

No dijo lo que debería suceder si el separador no está presente. Tanto esta como la solución de Alex devolverán toda la cadena en ese caso.

+0

La solicitud es "eliminar todo el texto después" del separador, no "obtener" ese texto, por lo que creo que desea [0], no [-1], en su solución por lo demás excelente. –

+0

Funcionó perfectamente gracias, como estoy seguro que Ayman y Alex también lo hicieron, así que gracias a todos. – Solihull

+3

Use rsplit() si necesita dividir por un carácter empezando desde el final de la cadena. – Samuel

7

Sin RE (que supongo es lo que desea):

def remafterellipsis(text): 
    where_ellipsis = text.find('...') 
    if where_ellipsis == -1: 
    return text 
    return text[:where_ellipsis + 3] 

o, con un RE:

import re 

def remwithre(text, there=re.compile(re.escape('...')+'.*')): 
    return there.sub('', text) 
+0

Podría usar sep = '...' como kwarg y usar len (sep) en lugar de hard-coding the 3 para hacerlo un poco más a prueba de futuro. – cdleary

+0

Sí, pero luego necesita recompilar el RE en cada llamada, por lo que el rendimiento se resiente de la solución RE (no hay una diferencia real para la solución no RE). Algunas generalidades son gratuitas, otras no ... ;-) –

+0

@Alex - ¡Gracias por probar las soluciones! –

54

Suponiendo que su separador es '...', pero puede ser cualquier cadena.

text = 'some string... this part will be removed.' 
head, sep, tail = text.partition('...') 

>>> print head 
some string 

Si no se encuentra el separador, head contendrá toda la cadena original.

La función de partición se agregó en Python 2.5.

partición (...) S.partition (sep) -> (cabeza, sep, cola)

Searches for the separator sep in S, and returns the part before it, 
the separator itself, and the part after it. If the separator is not 
found, returns S and two empty strings. 
+0

Otra solución excelente - ¿Estamos violando TOOOWTDI? -) Tal vez vale la pena correr un tiempo para comprobar ... –

+8

.partition wins - 0.756 usec por ciclo, vs 1.13 para .split (el formato de comentario no me permite mostrar las pruebas exactas, pero estoy usando el texto y el separador de @ Ayman) - entonces, +1 para @ Ayman's ¡responder! –

+1

y por cierto, para completar, la solución basada en RE es de 2.54 usec, es decir, mucho más lenta que la de @Alyman o @Ned. –

0

otra manera fácil utilizando volver habrá

import re, clr 

text = 'some string... this part will be removed.' 

text= re.search(r'(\A.*)\.\.\..+',url,re.DOTALL|re.IGNORECASE).group(1) 

// text = some string 
6

Si desea eliminar todo después de la última aparición del separador en una cadena, me parece que esto funciona bien:

<separator>.join(string_to_split.split(<separator>)[:-1])

Por ejemplo, si string_to_split es un camino como root/location/child/too_far.exe y sólo desea la ruta de la carpeta, se puede dividir por "/".join(string_to_split.split("/")[:-1]) y obtendrá root/location/child

+0

Además, puede cambiar ese -1 a cualquier índice para que sea la ocurrencia en la que se suelta el texto. – theannouncer

Cuestiones relacionadas