2009-05-24 16 views
63

Ho una stringa. Come rimuovo tutto il testo dopo un determinato carattere? (In questo caso ...)
Il testo dopo volontà ... cambiamento così mi è per questo che voglio rimuovere tutti i caratteri dopo un certo uno.Come rimuovere tutti i caratteri dopo un carattere specifico in python?

+5

Se non sei sicuro che abbia senso, quindi aggiorna la tua domanda per fornire esempi specifici di ciò che vuoi fare. –

risposta

118

Split sul separatore al massimo una volta, e prendere 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.

+0

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

+0

Ho lavorato perfettamente grazie, sono sicuro che anche Ayman e Alex lo hanno fatto, quindi grazie a tutti. – Solihull

+3

Utilizzare rsplit() se è necessario dividere un carattere a partire dalla fine della stringa. – Samuel

7

Senza un RE (che presumo è quello che volete):

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

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

+0

Sì, ma poi è necessario ricompilare l'RE per ogni chiamata, quindi le prestazioni soffre per la soluzione RE (nessuna vera differenza per la soluzione non RE). Alcune generalità sono gratuite, altre no ... ;-) –

+0

@Alex - Grazie per aver testato le soluzioni! –

54

Supponendo che il 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, head conterrà tutta la stringa originale.

La funzione di partizione è stata aggiunta in Python 2.5.

partizione (...) S.partition (settembre) -> (testa, settembre, 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. 
+0

Ancora un'altra soluzione eccellente - stiamo violando TOOOWTDI? -) Forse vale la pena eseguire un timeit per controllare ... –

+8

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

+1

e btw, per completezza, la soluzione basata su RE è 2.54 usec, cioè più lenta di quella di @ Ayman o di @ Ned. La partizione –

0

un altro modo semplice utilizzando ri 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 
6

Se si desidera rimuovere tutto dopo l'ultima occorrenza del separatore in una stringa, trovo che funzioni correttamente:

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

Per esempio, se string_to_split è un percorso come root/location/child/too_far.exe e si desidera solo il percorso della cartella, è possibile dividere per "/".join(string_to_split.split("/")[:-1]) e si otterrà root/location/child

+0

Inoltre, è possibile modificare tale valore -1 in qualsiasi indice per essere l'occorrenza in cui si rilascia il testo. – theannouncer

Problemi correlati