Wie entferne ich alle Zeichen nach einem bestimmten Zeichen in Python?

147

Ich habe eine Schnur. Wie entferne ich den gesamten Text nach einem bestimmten Zeichen? ( In diesem Fall... )
Der Text danach ...ändert sich, deshalb möchte ich alle Zeichen nach einem bestimmten entfernen.

Solihull
quelle
6
Wenn Sie nicht sicher sind, ob dies sinnvoll ist, aktualisieren Sie Ihre Frage, um konkrete Beispiele für die gewünschten Aktionen bereitzustellen.
S.Lott

Antworten:

259

Teilen Sie Ihren Separator höchstens einmal auf und nehmen Sie das erste Stück:

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

Sie haben nicht gesagt, was passieren soll, wenn das Trennzeichen nicht vorhanden ist. Sowohl diese als auch Alex 'Lösung geben in diesem Fall die gesamte Zeichenfolge zurück.

Ned Batchelder
quelle
Die Anforderung lautet "Entfernen Sie den gesamten Text nach" dem Trennzeichen und "holen" Sie diesen Text nicht. Ich denke, Sie möchten [0] und nicht [-1] in Ihrer ansonsten hervorragenden Lösung.
Alex Martelli
Hat perfekt funktioniert, danke, wie ich sicher bin, dass Ayman & Alex es auch getan haben, also danke euch allen.
Solihull
5
Verwenden Sie rsplit (), wenn Sie ab dem Ende der Zeichenfolge durch ein Zeichen teilen müssen.
Samuel
rsplit () beantwortet tatsächlich die Frage, ob das Trennzeichen mehrfach vorkommt
Nate
93

Angenommen, Ihr Trennzeichen ist '...', aber es kann eine beliebige Zeichenfolge sein.

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

>>> print head
some string

Wenn das Trennzeichen nicht gefunden headwird, enthält es die gesamte ursprüngliche Zeichenfolge.

Die Partitionsfunktion wurde in Python 2.5 hinzugefügt.

Partition (...) S. Partition (sep) -> (Kopf, sep, Schwanz)

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.
Ayman Hourieh
quelle
Noch eine ausgezeichnete Lösung - verletzen wir TOOOWTDI? -) Vielleicht ist es einen Zeitaufwand wert, um zu überprüfen ...
Alex Martelli
9
.partition gewinnt - 0,756 usec pro Schleife, gegenüber 1,13 für .split (bei der Formatierung von Kommentaren kann ich die genauen Tests nicht wirklich anzeigen, aber ich verwende @ Aymans Text und Trennzeichen) - also +1 für @ Aymans Antwort !
Alex Martelli
1
und der Vollständigkeit halber ist die RE-basierte Lösung 2,54 usec, dh viel langsamer als @ Ayman's oder @ Ned's.
Alex Martelli
Partition gewinnt, wenn Sie in 2,5 Land sind :) Für uns Trottel, die in 2.4 stecken, müssen wir mit relativ eiszeitlicher Langsamkeit der Spaltung leben.
Gregg Lind
Beispiel ist wirklich hilfreich.
Md. Sabbir Ahmed
18

Wenn Sie nach dem letzten Auftreten eines Trennzeichens in einer Zeichenfolge alles entfernen möchten, funktioniert dies gut:

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

Wenn es sich beispielsweise string_to_splitum einen Pfad handelt root/location/child/too_far.exeund Sie nur den Ordnerpfad möchten, können Sie diesen aufteilen "/".join(string_to_split.split("/")[:-1])und erhalten root/location/child

Der Ansager
quelle
1
Darüber hinaus können Sie diese -1 in einen beliebigen Index ändern, um das Vorkommen zu bestimmen, bei dem Sie Text ablegen.
Ansager
10

Ohne RE (von dem ich annehme, dass Sie es wollen):

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

oder mit einem RE:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)
Alex Martelli
quelle
Vielleicht möchten Sie sep = '...' als kwarg verwenden und len (sep) verwenden, anstatt die 3 hart zu codieren, um sie etwas zukunftssicherer zu machen.
CDLeary
Ja, aber dann müssen Sie die RE bei jedem Aufruf neu kompilieren, damit die Leistung für die RE-Lösung leidet (kein wirklicher Unterschied für die Nicht-RE-Lösung). Einige Allgemeinheit ist kostenlos, andere nicht ... ;-)
Alex Martelli
@ Alex - Danke, dass du die Lösungen getestet hast!
Ayman Hourieh
2

Die Methode find gibt die Zeichenposition in einer Zeichenfolge zurück. Wenn Sie dann alles aus dem Charakter entfernen möchten, gehen Sie folgendermaßen vor:

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

>> '123'

Wenn Sie den Charakter behalten möchten, fügen Sie der Charakterposition 1 hinzu.

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

Ausgabe: "Dies ist ein Test"

Marcus
quelle
Bitte erklären Sie
lone_coder
1

Aus einer Datei:

import re
sep = '...'

with open("requirements.txt") as file_in:
    lines = []
    for line in file_in:
        res = line.split(sep, 1)[0]
        print(res)
parikhparth23
quelle
0

Eine andere einfache Möglichkeit, re zu verwenden, wird sein

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
Rohail
quelle