Wyrażenia regularne w przeszukiwaniu tekstu

Wyrazenia Regularne W Przeszukiwaniu Tekstu

Wyrażenia regularne – brzmi to groźnie, prawda? Jakbyśmy mieli do czynienia z enigmatycznymi, matematycznymi symbolami, które rozumie tylko garstka wtajemniczonych. I owszem, wyrażenia regularne pełne są różnych znaków, jednak są one znacznie prostsze do opanowania, niż mogłoby się wydawać. Mówię to jako były pracownik uczelni technicznej, który już dawno „zmęczył się” matematycznymi zapisami.

Wyrażenie regularne to opis pewnego wzorca, którego szukamy w tekście. Czym może być taki wzorzec? Na przykład datą, jak 21.07.2020 – to ciąg cyfr z określonego zakresu, oddzielonych kropkami. Wzorzec może także opisywać ciąg liczb, które padły w losowaniu Lotto: 2, 4, 22, 26, 31, 35. Wyrażenia regularne pozwalają opisać również adres e-mail, adres strony internetowej czy oczekiwane znaki w haśle do konta bankowego. Wzorcem jest także fakt, że każde nowe zdanie po kropce zaczynamy z dużej litery. Innymi słowy, wyrażenia regularne pozwalają nam opisać i odnaleźć w tekście dowolny, powtarzalny wzorzec.

Koncepcja automatu przeszukującego tekst w poszukiwaniu wzorca jest znana od lat 50. XX wieku. Jedna z pierwszych implementacji została napisana w języku SNOBOL – z naszego punktu widzenia nazwa niezbyt trafiona 🙂

Przejdźmy teraz do zastosowania wyrażeń regularnych w przeszukiwaniu tekstu. Najczęściej używa się ich w skomplikowanych systemach informatycznych do wyszukiwania i dalszego przetwarzania ciągów znaków, które przeciętnemu użytkownikowi mogą wydawać się mało zrozumiałe. Wyrażenia te służą także do walidacji (sprawdzania poprawności) tekstu wpisanego przez użytkownika. Czy jednak mogą się przydać w codziennym życiu? Zdecydowanie tak!

Pierwsze przeszukiwanie

Załóżmy, że przeszukujemy stronę Wikipedia – XVIII wiek w poszukiwaniu osób, które urodziły się w XVII wieku i żyły jeszcze w latach 20. XVIII wieku. Po wpisaniu na stronie frazy „16” otrzymujemy ponad 100 wyników – powodzenia w przeglądaniu wszystkiego… Jak sobie z tym poradzić? Odpowiedź brzmi: wyrażenia regularne! Ale gdzie ich użyć?

Sprawdź również  Netykieta w Internecie

Najprostszym rozwiązaniem jest skorzystanie ze strony regex101.com. Wklejamy tam całą zawartość strony Wikipedii (Ctrl+A, Ctrl+C, Ctrl+V) w pole „TEST STRING”, a w pole „REGULAR EXPRESSION” wpisujemy wyrażenie regularne. Po prawej stronie, w polu „MATCH INFORMATION”, otrzymamy wyniki wyszukiwania. Możemy kliknąć na wynik, aby przenieść się do miejsca w tekście, gdzie go znaleziono.

Załóżmy, że już skopiowaliśmy całą stronę. Czas wpisać wyrażenie regularne! Oto rozwiązanie i jego opis:

16[0-9]{2}-17[2-9][0-9]

Otrzymujemy około 20 wyników. Znalezienie ich ręcznie byłoby bardzo trudne. Ale co oznacza to wyrażenie?

  • 16 – Szukamy ciągu znaków rozpoczynającego się od „16” (szukamy wydarzeń z XVII wieku).
  • [0-9]{2} – Oczekujemy dwóch cyfr z zakresu od 0 do 9 (np. 1625).
  • -17 – Szukamy dalszej części, która zaczyna się od „-17” (wskazując na XVIII wiek).
  • [2-9][0-9] – Oczekujemy liczb z zakresu 1720-1799.

Teraz poszukajmy wszystkich słów:

[a-zA-Ząęźćżłóń]+

Znaleziono około 5641 wyników! Sporo pracy… Oto wyjaśnienie:

  • [a-zA-Ząęźćżłóń] – Szukamy wszystkich małych i dużych liter, w tym polskich znaków.
  • + – Oznacza, że szukany ciąg znaków musi wystąpić co najmniej raz.

Znajdźmy teraz wszystkie miejsca, gdzie wspomniany jest lipiec lub luty:

lipc[a-z]*|lut[a-z]*

Znaleziono 23 wystąpienia. Oto wyjaśnienie:

  • lipc[a-z]* – Szukamy wszystkich wyrazów zaczynających się od „lipc”, czyli „lipiec”, „lipca” itd.
  • | – To operator „lub”, oznaczający alternatywę między wzorcami.
  • lut[a-z]* – Szukamy wyrazów zaczynających się od „lut”, czyli „luty”, „lutego” itd.

Czas na bardziej zaawansowane przeszukiwanie

Przejdźmy teraz do przeszukania historii Polski na stronie Wikipedia – Polska. Chcemy znaleźć akapity, w których wspomniany jest król i które dotyczą XVIII i XIX wieku. Możemy to zrobić na dwa sposoby:

  1. Szukać występowania dat przed lub po słowie „król” w danym akapicie.
  2. Skorzystać z nowej formuły szukania w przód z wynikiem pozytywnym (ang. positive lookahead).
Sprawdź również  Jak szybko i skutecznie wyszukiwać informacje w Internecie

Zacznijmy od pierwszego przypadku:

^.*(1[7-8][0-9]{2})?.*[Kk]ról.*(1[7-8][0-9]{2})?.*$

Brzmi skomplikowanie, prawda? Na tyle, że przeglądarka może mieć problem z przetworzeniem tego w rozsądnym czasie. Dlatego operację najlepiej przeprowadzić na komputerze lokalnym, korzystając z edytora tekstu obsługującego wyrażenia regularne, np. Notepad++. Po zainstalowaniu tego programu, kopiujemy zawartość strony, wklejamy do edytora, a następnie, używając Ctrl+F, otwieramy okno wyszukiwania.

Przyjrzyjmy się dokładniej temu wyrażeniu:

  • ^ – Oznacza początek linii.
  • .*(1[7-8][0-9]{2})? – Szukamy daty (z XVIII lub XIX wieku), która może, ale nie musi wystąpić przed słowem „król”.
  • .[Kk]ról. – Szukamy słowa „król” (z dużej lub małej litery), przed lub po którym mogą wystąpić dowolne znaki.
  • $ – Oznacza koniec linii.

Czy to wyrażenie jest poprawne? Spróbujmy je uruchomić w Notepad++ i zobaczmy, jakie linie zostaną oznaczone jako pasujące do wzorca. Okaże się, że wzorzec jest zbyt elastyczny, ponieważ nie wymusza występowania daty przed lub po słowie „król”. Możemy to poprawić, używając składni szukania w przód z wynikiem pozytywnym:

^(?=.*1[7-8][0-9]{2}.*).*[Kk]ról.*$

To wyrażenie działa podobnie jak poprzednie, ale dodaje warunek, że szukana data musi wystąpić gdziekolwiek w akapicie przed lub po słowie „król”.

Teraz, w przeglądarce internetowej, otrzymujemy mniej wyników – około 8. Wszystkie powinny być zgodne z oczekiwaniami.

Oprócz szukania w przód z wynikiem pozytywnym, mamy jeszcze trzy podobne formuły. Oto wszystkie cztery:

  • (?=…) – Szukanie w przód z wynikiem pozytywnym.
  • (?!…) – Szukanie w przód z wynikiem negatywnym.
  • (?<=…) – Szukanie w tył z wynikiem pozytywnym.
  • (?<!…) – Szukanie w tył z wynikiem negatywnym.

Zachęcam do samodzielnego eksperymentowania z tymi wzorcami.

Na koniec pokażę, jak rozbudować poszukiwanie osób urodzonych w XVIII wieku, ale na podstawie wzoru daty urodzenia i śmierci. Wyszukiwarka na stronie regex101.com potrafi łączyć nie tylko wzorce w danym akapicie, ale także wzorce oddzielone nawiasami. Spróbujmy następującego wzoru:

Sprawdź również  Jak organizować spotkania w aplikacji Zoom 

(1[7-8][0-9]{2})?.*[Kk]ról.*(1[7-8][0-9]{2})?

Wzór ten ma podobne założenia jak poprzednie, ale:

  1. Akceptuje daty, które występują tylko w nawiasach.
  2. Zwraca pasujące akapity z całą datą.

W efekcie otrzymamy wiele pozytywnych wyników, zawierających w akapicie zarówno wzmiankę o królu, jak i daty z XVIII lub XIX wieku.

Podsumowując, wyrażenia regularne to potężne narzędzie, które warto opanować. Możliwość szybkiego i precyzyjnego przeszukiwania tekstów, zwłaszcza obszernych, przydaje się nie tylko w codziennej pracy, ale także w życiu codziennym. Pozwala ono na przykład skutecznie filtrować treści, znajdować określone informacje i zautomatyzować wiele czasochłonnych zadań. A więc – do dzieła!

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Scroll to Top