¿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.


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.


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.

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


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)

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.


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"


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)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.