R1O67V4HKLFEV
Żywy obraz w kolorze, przedstawiający mieszankę małych i wielkich liter w różnych czcionkach, starannie ułożonych w wyraźne słowa, z określonym fragmentem tekstu umieszczonym pod dużą, metalową lupą, znacznie powiększoną, aby odkryć skomplikowane detale, tekstury i style czcionek, na neutralnym tle, które pozwala literom i luce skupić uwagę, z wyrazami i literami wyświetlanymi w gamie jasnych, intensywnych kolorów, które kontrastują i uzupełniają się nawzajem, a lupa odbija światło, dodając scenie poczucie głębi i realizmu.

PY_I_P_W14_M16 Wyszukiwanie wzorca w tekście

Obraz wygenerowany przez sztuczną inteligencję leonardo.ai
Źródło: domena publiczna.

W Pythonie nie trzeba pisać całego algorytmu „od zera”, bo istnieją wbudowane funkcje i metody do wyszukiwania wzorca w tekście.

Przykład 1

Metoda find() – pierwsze wystąpienie wzorca. Program zwraca indeks pierwszego dopasowania albo -1, jeśli nie znajdzie wzorca.

Linia 1. tekst znak równości cudzysłów ababcababc cudzysłów. Linia 2. wzorzec znak równości cudzysłów abc cudzysłów. Linia 4. indeks znak równości tekst kropka find otwórz nawias okrągły wzorzec zamknij nawias okrągły. Linia 6. if indeks wykrzyknik znak równości minus 1 dwukropek. Linia 7. print otwórz nawias okrągły cudzysłów Pierwsze wystąpienie wzorca na pozycji dwukropek cudzysłów przecinek indeks zamknij nawias okrągły. Linia 8. else dwukropek. Linia 9. print otwórz nawias okrągły cudzysłów Brak wzorca w tekście kropka cudzysłów zamknij nawias okrągły.
  • Zaleta: szybka i prosta

  • Wada: znajduje tylko pierwsze wystąpienie

Przykład 2

Metoda rfind() – ostatnie wystąpienie wzorca

Linia 1. tekst znak równości cudzysłów ababcababc cudzysłów. Linia 2. wzorzec znak równości cudzysłów abc cudzysłów. Linia 4. indeks znak równości tekst kropka rfind otwórz nawias okrągły wzorzec zamknij nawias okrągły. Linia 6. if indeks wykrzyknik znak równości minus 1 dwukropek. Linia 7. print otwórz nawias okrągły cudzysłów Ostatnie wystąpienie wzorca na pozycji dwukropek cudzysłów przecinek indeks zamknij nawias okrągły. Linia 8. else dwukropek. Linia 9. print otwórz nawias okrągły cudzysłów Brak wzorca w tekście kropka cudzysłów zamknij nawias okrągły.
  • Zaleta: szybka i prosta

  • Wada: znajduje tylko pierwsze wystąpienie

Przykład 3

Pętla z find() – wszystkie wystąpienia wzorca

Linia 1. tekst znak równości cudzysłów ababcababc cudzysłów. Linia 2. wzorzec znak równości cudzysłów abc cudzysłów. Linia 3. pozycje znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 5. start znak równości 0. Linia 6. while True dwukropek. Linia 7. indeks znak równości tekst kropka find otwórz nawias okrągły wzorzec przecinek start zamknij nawias okrągły. Linia 8. if indeks znak równości znak równości minus 1 dwukropek. Linia 9. break. Linia 10. pozycje kropka append otwórz nawias okrągły indeks zamknij nawias okrągły. Linia 11. start znak równości indeks plus 1 kratka przesuwamy się dalej po tekście. Linia 13. if pozycje dwukropek. Linia 14. print otwórz nawias okrągły cudzysłów Wzorzec występuje na pozycjach dwukropek cudzysłów przecinek pozycje zamknij nawias okrągły. Linia 15. else dwukropek. Linia 16. print otwórz nawias okrągły cudzysłów Brak wzorca w tekście kropka cudzysłów zamknij nawias okrągły.
  • Zaleta: prosty sposób na wszystkie dopasowania

  • Wada: nie działa na bardziej skomplikowane wzorce (np. z symbolami wieloznacznymi)

Porównanie wydajności dwóch metod wyszukiwania wzorca w tekście:

  • metody naiwnej (ręczna implementacja)

  • funkcji wbudowanej find()

Zobaczysz, że wbudowana funkcja Pythona jest znacznie szybsza, bo napisana w języku C i zoptymalizowana.

Kod porównawczy – wydajność metod wyszukiwania

  • Obie funkcje szukają tego samego wzorca „abab” w milionie znaków.

  • Wyniki są takie same (znaleziony indeks = 0).

  • Czas wykonania dla find() będzie setki lub tysiące razy krótszy niż dla metody naiwnej (w zależności od długości i zawartości tekstu i wzorca).

Linia 1. import time. Linia 3. kratka Tworzymy długi tekst otwórz nawias okrągły 1 000 000 znaków zamknij nawias okrągły. Linia 4. tekst znak równości cudzysłów ab cudzysłów asterysk 500 podkreślnik 000 kratka czyli cudzysłów ababababab kropka kropka kropka cudzysłów długości 1 mln. Linia 5. wzorzec znak równości cudzysłów abab cudzysłów. Linia 7. kratka minus minus minus Metoda 1 dwukropek Naiwna implementacja minus minus minus. Linia 8. def wyszukiwanie podkreślnik naiwne otwórz nawias okrągły tekst przecinek wzorzec zamknij nawias okrągły dwukropek. Linia 9. n znak równości len otwórz nawias okrągły tekst zamknij nawias okrągły. Linia 10. m znak równości len otwórz nawias okrągły wzorzec zamknij nawias okrągły. Linia 11. for i in range otwórz nawias okrągły n minus m plus 1 zamknij nawias okrągły dwukropek. Linia 12. if tekst otwórz nawias kwadratowy i dwukropek i plus m zamknij nawias kwadratowy znak równości znak równości wzorzec dwukropek. Linia 13. return i kratka zwróć pierwsze wystąpienie. Linia 14. return minus 1. Linia 16. kratka minus minus minus Metoda 2 dwukropek Wbudowana funkcja find otwórz nawias okrągły zamknij nawias okrągły minus minus minus. Linia 17. def wyszukiwanie podkreślnik find otwórz nawias okrągły tekst przecinek wzorzec zamknij nawias okrągły dwukropek. Linia 18. return tekst kropka find otwórz nawias okrągły wzorzec zamknij nawias okrągły. Linia 20. kratka Pomiar czasu działania metody naiwnej. Linia 21. start znak równości time kropka time otwórz nawias okrągły zamknij nawias okrągły. Linia 22. wynik1 znak równości wyszukiwanie podkreślnik naiwne otwórz nawias okrągły tekst przecinek wzorzec zamknij nawias okrągły. Linia 23. czas1 znak równości time kropka time otwórz nawias okrągły zamknij nawias okrągły minus start. Linia 25. kratka Pomiar czasu działania funkcji find otwórz nawias okrągły zamknij nawias okrągły. Linia 26. start znak równości time kropka time otwórz nawias okrągły zamknij nawias okrągły. Linia 27. wynik2 znak równości wyszukiwanie podkreślnik find otwórz nawias okrągły tekst przecinek wzorzec zamknij nawias okrągły. Linia 28. czas2 znak równości time kropka time otwórz nawias okrągły zamknij nawias okrągły minus start. Linia 30. kratka Wyniki. Linia 31. print otwórz nawias okrągły f cudzysłów Naiwna metoda dwukropek wynik znak równości otwórz nawias klamrowy wynik1 zamknij nawias klamrowy przecinek czas znak równości otwórz nawias klamrowy czas1 dwukropek kropka 6f zamknij nawias klamrowy s cudzysłów zamknij nawias okrągły. Linia 32. print otwórz nawias okrągły f cudzysłów Metoda find otwórz nawias okrągły zamknij nawias okrągły dwukropek wynik znak równości otwórz nawias klamrowy wynik2 zamknij nawias klamrowy przecinek czas znak równości otwórz nawias klamrowy czas2 dwukropek kropka 6f zamknij nawias klamrowy s cudzysłów zamknij nawias okrągły. Linia 34. kratka Porównanie. Linia 35. szybsza znak równości cudzysłów find otwórz nawias okrągły zamknij nawias okrągły cudzysłów if czas2 otwórz nawias ostrokątny czas1 else cudzysłów naiwna cudzysłów. Linia 36. print otwórz nawias okrągły f cudzysłów lewy ukośnik n Szybsza metoda dwukropek otwórz nawias klamrowy szybsza zamknij nawias klamrowy cudzysłów zamknij nawias okrągły.