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.


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.


Żą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.

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


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)

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.


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”


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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.