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?
risposta
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.
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. –
Ho lavorato perfettamente grazie, sono sicuro che anche Ayman e Alex lo hanno fatto, quindi grazie a tutti. – Solihull
Utilizzare rsplit() se è necessario dividere un carattere a partire dalla fine della stringa. – Samuel
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)
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
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 ... ;-) –
@Alex - Grazie per aver testato le soluzioni! –
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.
Ancora un'altra soluzione eccellente - stiamo violando TOOOWTDI? -) Forse vale la pena eseguire un timeit per controllare ... –
.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! –
e btw, per completezza, la soluzione basata su RE è 2.54 usec, cioè più lenta di quella di @ Ayman o di @ Ned. La partizione –
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
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
Inoltre, è possibile modificare tale valore -1 in qualsiasi indice per essere l'occorrenza in cui si rilascia il testo. – theannouncer
Se non sei sicuro che abbia senso, quindi aggiorna la tua domanda per fornire esempi specifici di ciò che vuoi fare. –