Come rimuovere tutti i personaggi dopo un personaggio specifico in Python?


148

Ho una corda Come rimuovo tutto il testo dopo un certo carattere? ( In questo caso... )
Il testo dopo ...cambierà, quindi è per questo che voglio rimuovere tutti i caratteri dopo un certo.


6
Se non sei sicuro che abbia senso, allora aggiorna la tua domanda per fornire esempi specifici di ciò che vuoi fare.
S.Lott

Risposte:


259

Dividi il separatore al massimo una volta e prendi il primo pezzo:

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

Non hai detto cosa dovrebbe succedere se il separatore non è presente. Sia questa che la soluzione di Alex restituiranno l'intera stringa in quel caso.


La richiesta è "rimuovi tutto il testo dopo" il separatore, non "ottieni" quel testo, quindi penso che tu voglia [0], non [-1], nella tua soluzione altrimenti eccellente.
Alex Martelli,

Ha funzionato perfettamente grazie, come sono sicuro che anche Ayman e Alex hanno fatto, quindi grazie a tutti.
Solihull,

5
Usa rsplit () se devi dividere per un carattere a partire dalla fine della stringa.
Samuel,

rsplit () in realtà risponde alla domanda se ci sono più occorrenze del separatore
Nate

94

Supponendo che il tuo separatore sia '...', ma può essere qualsiasi stringa.

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

>>> print head
some string

Se il separatore non viene trovato, headconterrà tutta la stringa originale.

La funzione di partizione è stata aggiunta in Python 2.5.

partizione (...) S.partizione (sep) -> (testa, sep, coda)

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.

Ennesima soluzione eccellente - stiamo violando TOOOWTDI? -) Forse vale la pena correre per controllare ...
Alex Martelli,

9
.partition vince - 0,756 usec per loop, contro 1,13 per .split (la formattazione dei commenti non mi consente di mostrare i test esatti, ma sto usando il testo e il separatore di @ Ayman) - quindi, +1 per la risposta di @ Ayman !
Alex Martelli,

1
e tra l'altro, per completezza, la soluzione basata su RE è 2,54 usec, cioè molto più lenta di quella di @ Ayman o di @ Ned.
Alex Martelli,

la partizione vince se sei in 2.5 terra :) Per noi ventose bloccati nella 2.4, dobbiamo vivere con una lentezza relativamente glaciale della divisione.
Gregg Lind,

L'esempio è davvero utile.
Md. Sabbir Ahmed,

18

Se vuoi rimuovere tutto dopo l'ultima occorrenza del separatore in una stringa trovo che funzioni bene:

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

Ad esempio, se string_to_splitè un percorso simile root/location/child/too_far.exee vuoi solo il percorso della cartella, puoi dividerlo "/".join(string_to_split.split("/")[:-1])e otterrai root/location/child


1
inoltre, è possibile modificare tale -1 in qualsiasi indice in modo che si verifichi il momento in cui si rilascia il testo.
Anniversario del

10

Senza un RE (che presumo sia quello che vuoi):

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)

Potrebbe voler usare sep = '...' come kwarg e usare len (sep) invece di codificare il 3 per renderlo leggermente più a prova di futuro.
cdleary,

Sì, ma è necessario ricompilare l'IR per ogni chiamata, quindi le prestazioni risentono della soluzione RE (nessuna differenza reale per la soluzione non RE). Un po 'di generalità è gratuita, altre no ... ;-)
Alex Martelli,

@Alex - Grazie per aver testato le soluzioni!
Ayman Hourieh,

2

Il metodo find restituirà la posizione del carattere in una stringa. Quindi, se vuoi rimuovere ogni cosa dal personaggio, fai questo:

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

>> '123'

Se vuoi mantenere il personaggio, aggiungi 1 alla posizione del personaggio.


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

Output: "Questo è un test"


si prega gentilmente di spiegare
lone_coder il

1

Da un file:

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

un altro modo semplice con re sarà

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.