Zapisz jako PDF
Transkrypt
Zapisz jako PDF
TI:WTBD/WyrażeniaRegularne
Wyrażenia regularne (RE, RegEx, RegExp) to składnia budowy wzorców, definiujących klasy
pasujących napisów. Implementacja polega na bibliotece funkcji/klas, które interpretują te wzorce i
stosują je do określania operacji, jakie mają być wykonane na napisach.
Wyrażenia regularne pozwalają często uniknąć żmudnego analizowania napisów znak po znaku, ale
nie są uniwersalnym narzędziem do analizy formatów tekstowych -- tylko raczej szczeblem
pośrednim pomiędzy analizą danych tekstowych kodem ad hoc, a wykorzystaniem
wyspecjalizowanych parserów. W szczególności, nie wystarczają one do analizy złożonych formatów
czy języków (języki programowania, XML, ...).
Istnieje kilka nieco różniących się implementacji wyrażeń regularnych:
POSIX / GNU (grep, sed, awk)
Perl (PCRE)
Python
Javascript
...
Podstawowa składnia (rozszerzona, w terminach POSIX)
są znaki zwykłe, i metaznaki
metaznaki to:
. ^ $ * + ? { } [ ] \ | ( )
znaki zwykłe to cała reszta
znaki zwykłe oznaczają same siebie, metaznaki -- operatory, grupowania, elementy wymienne
\ stosuje się do wyłączenia interpretacji następującego po nim metaznaku
pojedynczy znak jest regexpem
elementy wymienne to też regexpy:
. -- dowolny pojedynczy znak
[rjb] -- zestaw: dowolny 1 z wymienionych
[a-k] -- zakres
[[:alpha:]] -- klasa nazwana, np. tu: dowolna z liter (jest ich kilka)
[^...] -- dopełnienie zestawu, zakresu, klasy
operatory to:
sklejanie (gdy piszemy jeden regexp za drugim)
zwielokrotnianie -- operatory postfixowe:
* -- dowolna wielokrotność (w tym -zero)
+ -- krotność co najmniej 1
? -- krotność 0 lub 1
{n,m} -- krotność od n do m włącznie; każdą z tych liczb można pominąć nie
określając dolnego czy odp. górnego ograniczenia
{n} -- krotność dokładnie n
alternatywa: do A|B pasuje suma tego co pasuje do A i tego co do B.
kolejność operacji to: zwielokrotnianie, sklejanie, alternatywa
do grupowania -- narzucenia łączności operacji można użyć nawiasów okrągłych
nawiasy okrągłe definiują również referencje wsteczne:
\n oznacza kolejne wystąpienie w odp. miejscu podnapisu, który pasował do n-tej grupy
w nawiasach (w składni Posix n < 10)
^ $ oznaczają odpowiednio początek i koniec napisu (linii w przypadku grep).
Taka składnia obowiązuje w egrep (grep -E) i awk. Zwykły grep nie rozpoznaje
? + { | ( )
jako metaznaków, tylko odwrotnie -- interpretuje je, jeśli są poprzedzone znakiem \ (zaszłość
historyczna).
Przykłady wyrażeń regularnych
grep
Domyślnie: przetwarza strumień tekstowy jako ciąg linijek
Dla każdej linijki ustala czy zawiera ona podnapis pasujący do zadanego argumentem wyr.
regularnego
jeśli tak: wypisuje linijkę, jeśli nie: pomija
często używane opcje:
-E -- włącza składnię ,,rozszerzoną", p. uwaga powyżej
-v -- dopełnienie: przepuszcza linie nie pasujące
-i -- utożsamia małe i wielkie litery
-r -- działa rekursywnie: jeśli któryś z argumentów jest katalogiem, to przegląda również
jego zawartość
-e -- argument tej opcji jest wzorcem (a nie np. kolejną opcją)
-x -- żada dokładnego dopasowania całości linii
-q -- nic nie pisać, tylko ustawić kod powrotu: 0 - znaleziono dopasowanie, !=0 - nie
znaleziono
-h -- pominąć nazwy plików w outpucie
Wyrażenia regularne w Pythonie - moduł re