Pytanie Jak usunąć wszystkie postacie po określonym znaku w python?


Mam ciąg. Jak usunąć cały tekst po określonej postaci? (W tym przypadku ...)
Tekst po woli ... zmienić, dlatego właśnie chcę usunąć wszystkie znaki po pewnym.


76
2018-05-24 21:56


pochodzenie


Jeśli nie masz pewności, czy to ma sens, zaktualizuj pytanie, aby podać konkretne przykłady tego, co chcesz zrobić. - S.Lott


Odpowiedzi:


Podziel maksymalnie jeden separator i weź pierwszy:

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

Nie powiedziałeś, co powinno się stać, jeśli separator nie jest obecny. Zarówno to, jak i rozwiązanie Alexa zwrócą cały ciąg w tym przypadku.


138
2018-05-24 22:01



Żądanie to "usuń cały tekst po" separatorze, a nie "pobierz" ten tekst, więc myślę, że chcesz [0], a nie [-1], w swoim znakomitym rozwiązaniu. - Alex Martelli
Pracowałem doskonale dzięki, jak jestem pewien, że Ayman i Alex też tak zrobili, więc dziękuję wam wszystkim. - Solihull
Użyj funkcji rsplit (), jeśli chcesz podzielić znak na znak zaczynający się od końca łańcucha. - Samuel
rsplit () faktycznie odpowiada na pytanie, czy występuje wiele wystąpień separatora - Nate


Zakładając, że twój separator 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, head będzie zawierał cały oryginalny ciąg.

Funkcja partycji została dodana w Pythonie 2.5.

przegroda(...)       S.partition (sep) -> (głowa, sep, 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.

59
2018-05-24 22:02



Kolejne doskonałe rozwiązanie - czy gwałcimy TOOOWTDI? - Może warto sprawdzić czas ... - Alex Martelli
.partition wins - 0.756 usec per loop, vs 1.13 dla .split (formatowanie komentarzy tak naprawdę nie pozwala mi pokazywać dokładnych testów, ale używam tekstu i separatora @imana) - czyli +1 dla odpowiedzi @ Ajana ! - Alex Martelli
a przy okazji, dla kompletności, rozwiązanie oparte na RE ma 2,54 usec, tj. wolniej niż w przypadku @ Ayman's lub @ Ned's. - Alex Martelli
partycja wygrywa, jeśli jesteś w 2.5 ziemi :) Dla nas, frajerów utkniętych w 2.4, musimy żyć z względnie lodowatym spowolnieniem podziału. - Gregg Lind


Bez RE (który zakładam, czego chcesz):

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

lub, z RE:

import re

def remwithre(text, there=re.compile(re.escape('...')+'.*')):
  return there.sub('', text)

7
2018-05-24 22:00



Może chcieć użyć sep = "..." jako kwarg i użyć len (sep) zamiast twardego kodowania 3, aby uczynić go nieco bardziej przyszłościowym. - cdleary
Tak, ale potem musisz przekompilować PŻ przy każdym wywołaniu, więc wydajność wpływa na rozwiązanie RE (nie ma prawdziwej różnicy dla rozwiązania nie-RE). Niektóre ogólności są bezpłatne, inne nie są ... ;-) - Alex Martelli
@Alex - Dziękujemy za testowanie rozwiązań! - Ayman Hourieh


Jeśli chcesz usunąć wszystko po ostatnim wystąpieniu separatora w ciągu znaków, to działa to dobrze:

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

Na przykład, jeśli string_to_split jest ścieżką podobną root/location/child/too_far.exe i chcesz tylko ścieżki folderu, możesz podzielić według "/".join(string_to_split.split("/")[:-1]) a dostaniesz root/location/child


7
2017-09-14 22:18



dodatkowo możesz zmienić wartość -1 na dowolny indeks, który będzie występował po kropli tekstu. - theannouncer


Innym łatwym sposobem użycia będzie ponowne

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

0
2018-05-20 10:42