Wprawadzenie do wyrażen regularnych zacznę od złotej mysli :)
Some people, when confronted with a problem, think: “I know, I’ll use regular expressions.” Now they have two problems.
Wyrażenia regularne
[aeiou]
- dowolna samogłoska
[^aeiou]
- dowolna spółgłoska (^
- negacja)
[a-z]
- dowolna mała litera z zakresu a-z
\d
- dowolna liczba dziesiętna, odpowiednik [0-9]
\D
- dowolna “nie-cyfra”, odpowiednik [^0-9]
\s
- dowolny “biały znak”, odpowiednik [\t\n\r\f\v]
\S
- dowolny “nie-biały znak” znak, odpowiednik [^\t\n\r\f\v]
\w
- dowolny znak alfanumeryczny, odpowiednik [a-zA-Z0-9_]
\W
- dowolny znak nie-alfanumeryczny, odpowiednik [^a-zA-Z0-9_]
\\
– po prostu ukośnik
\.
– po prostu kropka (nie jest to dowolny znak)
[AB]
– A lub B (umożliwia zdefiniowanie liczby powtórzeń)
A|B
– A lub B
Powtórzenia
?
- 0 lub 1
*
- 0 lub więcej
+
- 1 lub więcej
{n}
- powtórzenie dokładnie n razy
{min, max}
- liczba wystąpień
^string
- początek rozpoczyna się od string
string$
- kończy się na string
Greedy vs lazy
Domyślnie wszystkie kwantyfikatory (+, *, {n,m}, {n,} or {,m}, ?) są chciwe (greedy).
Wzorzec a+
dla frazy aaa
zwróci najdłuższy możliwy substring (aaa
)
Jeśli chcemy zmienić to zachowanie, musimy postawić znak zapytania ?
tuż za kwantyfikatorem: +?
, *?
, {n,m}?
. Wtedy otrzymamy najkrótsze dopasowanie.
Znak zapytania gdy następuje bezpośrednio po kwantyfikatorze to przełącza ten kwantyfikator z trybu “chciwego” na “leniwy”.
Przełączenie trybu nia działa dla {n}
- ściśle określona liczba powtórzeń.
Python
import re
pattern = re.compile(r'text') # r - raw string
pattern.match('text') #szuka na początku tekstu
pattern.search('sample text') # szuka w całym ciągu znaków
Przydatne metody dostępne w module re:
-
compile(pattern) – kompiluje zapytanie, co przyspiesza wyszukiwanie
-
findall(pattern, string) – zwraca obiekt z wszystkimi dopasowaniami
-
search(pattern, string) – zwraca obiekt z pierwszym dopasowaniem
-
match(pattern, string) – zwraca dopasowanie o ile jest na początku string’a
Regex101
Narzędzie do budowania i testowania zapytań : Regex101