¿Cómo eliminar todos los caracteres después de un carácter específico en Python?

148

Tengo una cuerda ¿Cómo elimino todo el texto después de cierto carácter? ( En este caso... )
El texto después ...cambiará, así que es por eso que quiero eliminar todos los caracteres después de cierto.

Solihull
fuente
66
Si no está seguro de que tenga sentido, actualice su pregunta para proporcionar ejemplos específicos de lo que desea hacer.
S.Lott

Respuestas:

259

Dividir en su separador como máximo una vez, y tomar la primera pieza:

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

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

Ned Batchelder
fuente
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 excelente solución.
Alex Martelli
Funcionó perfectamente gracias, como estoy seguro de que Ayman y Alex también lo hicieron, así que gracias a todos.
Solihull
55
Use rsplit () si necesita dividir por un carácter comenzando desde el final de la cadena.
Samuel
rsplit () en realidad responde a la pregunta si hay múltiples ocurrencias del separador
Nate
94

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, headcontendrá toda la cadena original.

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

partición (...) S. partición (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.
Ayman Hourieh
fuente
Sin embargo, otra excelente solución: ¿estamos violando TOOOWTDI? -) Quizás valga la pena correr para comprobar ...
Alex Martelli
9
.partition wins - 0.756 usec por ciclo, vs 1.13 para .split (el formato de comentarios no me permite mostrar las pruebas exactas, pero estoy usando el texto y el separador de @ Ayman) - entonces, +1 para la respuesta de @ Ayman !
Alex Martelli
1
y por cierto, para completar, la solución basada en RE es 2.54 usec, es decir, mucho más lenta que @ Ayman o @ Ned.
Alex Martelli
la partición gana si estás en tierra 2.5 :) Para nosotros los tontos atrapados en 2.4, tenemos que vivir con una lentitud de división relativamente glacial.
Gregg Lind
El ejemplo es realmente útil.
Md. Sabbir Ahmed
18

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

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

Por ejemplo, si string_to_splites una ruta como root/location/child/too_far.exey solo desea la ruta de la carpeta, puede dividir por "/".join(string_to_split.split("/")[:-1])y obtendrá root/location/child

el anunciador
fuente
1
además, puede cambiar ese -1 a cualquier índice para que sea la aparición en la que suelta el texto.
theannouncer
10

Sin un RE (que supongo es lo que quieres):

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)
Alex Martelli
fuente
Es posible que desee usar sep = '...' como un kwarg y usar len (sep) en lugar de codificar el 3 para hacerlo un poco más a prueba de futuro.
cdleary
Sí, pero debe volver a compilar el RE en cada llamada, por lo que el rendimiento se ve afectado por la solución RE (no hay una diferencia real para la solución que no es RE). Algunas generalidades son gratuitas, otras no ... ;-)
Alex Martelli
@ Alex - ¡Gracias por probar las soluciones!
Ayman Hourieh
2

El método find devolverá la posición del carácter en una cadena. Luego, si quieres eliminar todo del personaje, haz esto:

mystring = "123⋯567"
mystring[ 0 : mystring.index("⋯")]

>> '123'

Si desea conservar el personaje, agregue 1 a la posición del personaje.

Eduardo Freitas
fuente
1
import re
test = "This is a test...we should not be able to see this"
res = re.sub(r'\.\.\..*',"",test)
print(res)

Salida: "Esto es una prueba"

Marcus
fuente
amablemente por favor explique
lone_coder
1

De un archivo:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)
parikhparth23
fuente
0

otra forma fácil de usar re será

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
Rohail
fuente