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.