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.