Jak usunąć wszystkie znaki po określonym znaku w Pythonie?

148

Mam sznurek. Jak usunąć cały tekst po określonym znaku? ( W tym przypadku... )
Tekst po ...zmianie się zmieni, dlatego chcę usunąć wszystkie znaki po pewnym.

Solihull
źródło
6
Jeśli nie masz pewności, czy to ma sens, zaktualizuj swoje pytanie, podając konkretne przykłady tego, co chcesz zrobić.
S.Lott

Odpowiedzi:

259

Najpóźniej od razu podziel separator i weź pierwszy element:

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

Nie powiedziałeś, co się stanie, jeśli nie ma separatora. Zarówno to, jak i rozwiązanie Alexa zwróci w tym przypadku cały ciąg.

Ned Batchelder
źródło
Żądanie polega na „usunięciu całego tekstu po” separatorze, a nie „uzyskaniu” tego tekstu, więc myślę, że w swoim doskonałym rozwiązaniu chcesz użyć [0], a nie [-1].
Alex Martelli
Zadziałało idealnie, tak jak jestem pewien, że Ayman & Alex's również, więc dziękuję wszystkim.
Solihull
5
Użyj rsplit (), jeśli chcesz podzielić znak zaczynający się od końca ciągu.
Samuel
rsplit () faktycznie odpowiada na pytanie, czy występuje wiele wystąpień separatora
Nate
94

Zakładając, że separatorem jest „...”, ale może to być dowolny ciąg.

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

>>> print head
some string

Jeśli separator nie zostanie znaleziony, headbędzie zawierał cały oryginalny ciąg.

Funkcja partycji została dodana w Pythonie 2.5.

przegroda (...) S. partycja (sep) -> (głowa, wrz, ogon)

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
źródło
Jeszcze jedno doskonałe rozwiązanie - czy naruszamy TOOOWTDI? -) Może warto poświęcić trochę czasu na sprawdzenie ...
Alex Martelli
9
.partition wygrywa - 0,756 usek na pętlę, w porównaniu z 1,13 dla .split (formatowanie komentarzy tak naprawdę nie pozwala mi pokazać dokładnych testów, ale używam tekstu i separatora @ Aymana) - więc +1 dla odpowiedzi @ Aymana !
Alex Martelli
1
a przy okazji, dla kompletności, rozwiązanie oparte na RE jest 2,54 usec, tj. znacznie wolniej niż @ Ayman's lub @ Ned's.
Alex Martelli
podział wygrywa, jeśli jesteś w krainie 2.5 :) Dla nas frajerów, którzy utknęli w 2.4, musimy żyć ze stosunkowo lodowcową powolnością podziału.
Gregg Lind
Przykład jest naprawdę pomocny.
Md. Sabbir Ahmed
18

Jeśli chcesz usunąć wszystko po ostatnim wystąpieniu separatora w ciągu, uważam, że działa to dobrze:

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

Na przykład, jeśli string_to_splitjest to ścieżka podobna do ścieżki root/location/child/too_far.exei chcesz tylko ścieżkę do folderu, możesz ją podzielić, "/".join(string_to_split.split("/")[:-1])a otrzymasz root/location/child

głosiciel
źródło
1
dodatkowo możesz zmienić to -1 na dowolny indeks, aby był wystąpieniem, w którym upuszczasz tekst.
theannouncer
10

Bez RE (co, jak zakładam, jest tym, czego chcesz):

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

lub w przypadku RE:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)
Alex Martelli
źródło
Może chcieć użyć sep = '...' jako kwarg i użyć len (sep) zamiast na stałe zakodować 3, aby uczynić go nieco bardziej przyszłościowym.
cdleary
Tak, ale wtedy musisz ponownie skompilować RE przy każdym wywołaniu, więc wydajność rozwiązania RE cierpi (nie ma rzeczywistej różnicy w przypadku rozwiązania innego niż RE). Pewna ogólność jest bezpłatna, część nie ... ;-)
Alex Martelli
@Alex - Dziękujemy za przetestowanie rozwiązań!
Ayman Hourieh
2

Metoda find zwróci pozycję znaku w ciągu. Następnie, jeśli chcesz usunąć wszystko z postaci, zrób to:

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

>> '123'

Jeśli chcesz zachować znak, dodaj 1 do pozycji znaku.

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

Wynik: „To jest test”

Marcus
źródło
uprzejmie proszę o wyjaśnienie
lone_coder
1

Z pliku:

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
źródło
0

innym łatwym sposobem użycia re będzie

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
źródło