Usuwanie fragmentu tekstu

0

Witam. Mam pytanie odnosnie usuniecia fragmentu od jakiegoś podanego znaku do podanego innego znaku. Przykładowo w tekście "ala ma kota" usunąc fragment pomiędzy "m" oraz "k". Napisałem na razie program, który usuwa podana literę z tekstu natomiast nie mogę poradzic sobie z fragmentem. Bardzo proszę o pomoc.
Mój program:

def usun(s):
    s=list(s)
    for i in range(len(s)):
        if s[i]=="a":
            s[i]=""
    t="".join(s)
    print(t)

usun("abrakadabra")
0

Można to zrobić wyrażeniem regularnym, albo dobrze skonstruowanym algorytmem ;)

Tutaj masz zrobione ręcznie:
https://ideone.com/wXtrIe

A tu z wyrażeniem regularnym:
https://ideone.com/WbTmsa

1
 def usun(s, l1, l2):
    return ''.join(s.split(s[s.index(l1):s.index(l2)+1]))
0

W powyższym rozwiązaniu chyba trzeba się jeszcez upewnić, że druga znaleziona litera (w tym wypadku "k") nie jest przypadkiem przed pierwszą ("m"), bo inaczej nie zadziała dla tekstu typu "alak ma kota".

0

Tak, nie zadziała też jeśli chcemy usunąć fragment tekstu zawierający powtarzające się znaki, bo index zwraca pierwszy pasujący element stringa od lewej.

0

Huh, a co z metodą str.replace?

0

Czy replace przyjmuje wyrażenia regularne? Bo potrzebujemy zająć się nieznanymi znakami między znanymi znakami.

0

Wystarczy trochę logiki do drugiego indeksu.
Jeśli polecenie zakłada fragment od pierwszego znaku L1 do ostatniego L2:

def usun(s, l1, l2):
    return "".join(s.split(s[s.index(l1):abs(s[::-1].index(l2)-len(s))]))

Jeśli zakłada fragment od pierwszego znaku L1 do najbliższego następnego L2:

def usun(s, l1, l2):
    return "".join(s.split(s[s.index(l1):s[s.index(l1)+1:].index(l2)+s.index(l1)+2]))

Oczywiście można dać zmienne pomocnicze by było czytelne, oraz działało szybciej bez liczenia tego samego po kilka razy ;p. Ale podejrzewam że to nie jest kod który będzie działał przez XXX godzin uruchamiany X mln razy, więc powinno być ok :P

@Edit:
Oczywiście można to zrobić z metodą replace, tylko że zamieni nam wszystkie takie fragmenty na to co podamy po "".
Możemy wtedy dodać warunek opcjonalny ile takich fragmentów ma zamienić, jednak wtedy zrobi to dla podanej ilości fragmentów od początku.
Ale by być szczerym, nie ma opcji aby to działało dobrze dla dużych plików tekstowych, a użyteczność takiej funkcji jest śmieszna.
Wybieranie fragmentów po znakach, służy co najwyżej do celów edukacyjnych :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1