Como remover todos os caracteres após um caractere específico em python?


147

Eu tenho uma corda. Como removo todo o texto após um determinado caractere? ( Nesse caso... )
O texto a seguir será ...alterado, então é por isso que desejo remover todos os caracteres após um determinado.


6
Se não tiver certeza de que faz sentido, atualize sua pergunta para fornecer exemplos específicos do que você deseja fazer.
245 S.Lott

Respostas:


259

Divida o separador no máximo uma vez e pegue a primeira peça:

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

Você não disse o que deveria acontecer se o separador não estiver presente. Tanto a solução quanto a de Alex retornarão a string inteira nesse caso.


A solicitação é "remova todo o texto após" o separador, não "obtenha" esse texto, então acho que você deseja [0], não [-1], na sua solução excelente.
Alex Martelli 24/05

Funcionou perfeitamente graças, como eu tenho certeza que Ayman e Alex também fizeram, então obrigado a todos.
Solihull

5
Use rsplit () se precisar dividir por um caractere começando no final da string.
Samuel

rsplit () realmente responde à pergunta se há várias ocorrências do separador
Nate

93

Supondo que seu separador seja '...', mas pode ser qualquer string.

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

>>> print head
some string

Se o separador não for encontrado, headele conterá toda a sequência original.

A função de partição foi adicionada no Python 2.5.

partição (...) S.partition (sep) -> (cabeça, sep, cauda)

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.

No entanto, outra solução excelente - estamos violando TOOOWTDI -?) Talvez vale a pena timeit prazo para verificar ...
Alex Martelli

9
.partition vence - 0,756 usec por loop, vs 1,13 para .split (a formatação dos comentários realmente não permite que eu mostre os testes exatos, mas eu estou usando o texto e o separador de @ Ayman) - então, +1 na resposta de @ Ayman !
Alex Martelli 24/05

1
e, para completar, a solução baseada em RE é de 2,54 usec, ou seja, muito mais lenta que a @ Ayman ou a @ Ned.
Alex Martelli 24/05

a partição vence se você estiver em 2,5 terrenos :) Para nós, otários presos no 2.4, temos que viver com uma lentidão relativamente glacial de divisão.
Gregg Lind 27/05

Exemplo é realmente útil.
Md. Sabbir Ahmed

18

Se você deseja remover tudo após a última ocorrência do separador em uma string, acho que isso funciona bem:

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

Por exemplo, se string_to_splitfor um caminho root/location/child/too_far.exee você desejar apenas o caminho da pasta, você poderá dividir por "/".join(string_to_split.split("/")[:-1])e obterá root/location/child


1
Além disso, você pode alterar esse -1 para qualquer índice para ser a ocorrência na qual você solta o texto.
Theannouncer

10

Sem um ER (que eu assumo é o que você deseja):

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

ou, com um ER:

import re

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

Talvez você queira usar sep = '...' como um kwarg e use len (sep) em vez de codificar o 3 para torná-lo um pouco mais à prova de futuro.
Cdleary 24/05

Sim, mas você precisa recompilar o ER em cada chamada, para que o desempenho seja prejudicado pela solução de ER (não há diferença real para a solução que não é de ER). Alguns generalidade é livre, alguns não é ... ;-)
Alex Martelli

@Alex - Obrigado por testar as soluções!
Ayman Hourieh 24/05/09

2

O método find retornará a posição do caractere em uma string. Então, se você deseja remover tudo do personagem, faça o seguinte:

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

>> '123'

Se você deseja manter o personagem, adicione 1 à posição do personagem.


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

Saída: "Este é um teste"


por favor, explique
lone_coder 03/04

1

De um arquivo:

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

outra maneira 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.