Wyrażenia regularne – regex

Wyrażenia regularne, popularnie określane jako regex, są bardzo przydatne. Dzięki nim łatwo można wyszukiwać dane frazy czy filtrować wyniki.

Python regex

Python regex


Jedną, może nie z niezbędnych, ale przydatnych umiejętności testerskich jest znajomość czym są wyrażenia regularne popularnie nazywanych regex — od angielskiego tłumaczenia – regular expression. Zacznijmy więc od określenia, co to są wyrażenia regularne. W sieci można znaleźć wiele definicji, które bardziej lub mniej trafnie opisują te wyrażenia, jednak według mnie możemy się ograniczyć do krótkiej definicji, że są to wzorce, które umożliwiają wyszukiwanie ciągi znaków o określonych cechach.

Podstawowe symbole

Wyrażenia regularne mogą być bardzo proste, jak również wielokrotnie złożone. Jednak do ich odszyfrowania trzeba znać przynajmniej podstawowe elementy, z jakich się one składają. Fundamentalnymi elementami są znaki określające początek i koniec wyrażenia oraz znaki zastępujący dowolny znak:

  • ^ – początek  wyrażenia,
  • & – koniec wyrażenia,
  • {} – liczba wystąpień znaku przed nawiasem,
  • * – zero lub więcej razy,
  • + – przynajmniej raz,
  • ? – zero lub jeden raz.

Przykłady użycia:

  • ^_{2} –  wyświetli wszystkie wyrażenia zaczynające się od co najmniej dwóch podkreśleń. Dopuszcza się tutaj używanie zakresów, z przecinkiem jako separator,
  • ^.*_$ – znajdzie nam wszystkie wyrażenia o dowolnej długości kończące się podkreśleniem,
  • .* – dowolny ciąg dowolnych znaków.

Zakresy

Dodatkowo najczęściej używanymi wyrażeniami regularnymi są te, określające zakresy, zawierające odpowiednio:

  • [a-z] — małe litery,
  • [A-Z] — duże litery,
  • [0-9] — cyfry

Należy pamiętać, że znak daszku (^) zaraz po otwarciu nawiasu, neguje zakres. Czyli [^0-9] oznacza wszystkie znaki z wałczeniem liczb. Alternatywnie można korzystać ze zdefiniowanych klas znakowych:

  • \d — analogicznie do [0-9],
  • \w — litery, cyfry oraz znak podkreślenia,
  • \s — spacja.

WIelkie litery oznaczają przeciwieństwo do małych, czyli:

  • \D — analogicznie do [^0-9]

Znak ucieczki

Znając już wszystkie znaki specjalne w regexach, należy zadać pytanie, co jeśli chcemy jakiś z nich użyć w naszym wzorcu? Służy do tego tak zwany znak ucieczki, czyli backslash (\), postawiony przed znakiem wybranym znakiem. Ważne jest, że chcąc wykorzystać we wzorcu backslash, również musimy zastosować znak ucieczki. Czyli zamiast \, używamy \\. Poniżej przykład wyrażenia z tym znakiem i bez:

  1. do wzorca ‚^.*test.txt$‚ dopasowane będą wszystkie wyrażenia, które kończą się na test[dowolny znak]txt, czyli na przykład nowytestatxt, test_txt, a także test.txt, czy nowytest.txt
  2. Doprecyzowując to wyrażenie do ‚^*test\.txt$‚, do naszego wzorca będą już tylko pasowały test.txt, czy nowytest.txt.

Przykłady

Poniżej zamieszczam kilka przydatnych przykładów wyrażeń regularnych, które mogą się przydać podczas filtrowania różnych treści:

  • [a-fA–F0-9] – wszystkie liczby heksadecymalne,
  • [0-1] – wszystkie liczby binarne,
  • [0-1]{8} – zawartość jednego bita,
  • [0-9] lub [\d] – wszystkie liczby dziesiętne,
  • [\t\f\n\v\r] – znaki białe,
  • ^$ puste linie.

Zachłanne czy leniwe zapytania?

Istotną właściwością wyrażeń regularnych jest ich zachłanność. Oznacza to, że każde wyrażenie będzie pobierało jak największą liczbę znaków. Aby temu zapobiec, można stworzyć leniwe zapytanie, które będzie pobierało najmniejszą możliwą liczbę znaków. Wykonujemy to poprzez dodanie znaku zapytania bezpośrednio po znaku powtórzenia:

  • Zachłanne zapytanie: ^[.*]
  • Leniwe zpaytanie: ^[.*?]

Jak widzimy, wyrażenia regularne potrafią w wielu przykładach znacznie uprościć pracę. Dodatkowym atutem jest fakt, że generalnie, nie zależą od języka programowania, w jakim zostaną użyte. Celowo użyłem słowa generalnie, gdyż w niektórych częściach mogą występować drobne różnice. Nie zmienia to jednak faktu, że są bardzo uniwersalne.

close

Newsletter