Języki formalne i automaty Ćwiczenia 6 Autor: Marcin Orchel Spis treści Spis treści... 1 Wstęp teoretyczny... 2 Wyrażenia regularne... 2 Standardy IEEE POSIX Basic Regular Expressions (BRE) oraz Extended Regular Expressions (ERE). 2 Wyrażenia regularne w Perlu... 3 Zastosowanie wyrażeń regularnych do operacji tekstowych... 4 Bibliografia... 4 Zadania... 5 Zadania na 3.0... 5 Zadania na 4.0... 5 Zadania na 5.0... 5
Wstęp teoretyczny Wyrażenia regularne Wyrażenia regularne to jeden ze sposobów reprezentacji języka formalnego. Każde wyrażenie regularne można przedstawić za pomocą gramatyki regularnej i odwrotnie. Definicja wyrażenia regularnego. Dany jest alfabet Σ. Wyrażeniami regularnymi są: ε - wyrażenie regularne oznaczające następujący język formalny {ε}, - wyrażenie regularne oznaczające język formalny:, a - wyrażenie regularne oznaczające język formalny {a}, gdzie a Σ. Ponadto wyrażeniami regularnymi są: RS - wyrażenie regularne oznaczające konkatenację dwóch zbiorów A i B wyrażonych za pomocą wyrażeń regularnych R i S odpowiednio: {αβ α A and β B}, R S - wyrażenie regularne oznaczające alternatywę dwóch zbiorów A i B wyrażonych za pomocą wyrażeń regularnych R i S, R* - wyrażenie regularne oznaczające gwiazdę Kleene'go na zbiorze A wyrażonym za pomocą wyrażenia regularnego R, to znaczy jest to zbiór wszystkich słów z R oraz słów powstałych przez konkatenację słów z języka R, zawierający również łańcuch pusty. Ponadto w wyrażeniach regularnych można używać nawiasów pomocnych w definiowaniu priorytetów działań. Standardowe priorytety są następujące od najwyższego: gwiazda Kleenego, konkatenacja, alternatywa. Przykłady wyrażeń regularnych: a b* oznacza zbiór {ε, a, b, bb, bbb,...} (a b)* oznacza zbiór wszystkich słów z symbolami a oraz b, łącznie z łańcuchem pustym. ab*(c ε) oznacza zbiór wszystkich słów rozpoczynających się od a, później zero lub więcej symboli b, i na końcu opcjonalnie c. Często w definicjach wyrażeń regularnych spotyka się następujące redundantne symbole: R+ oznacza zbiór zbiór wszystkich słów z R oraz słów powstałych przez konkatenację słów z wyrażenia R nie zawierający łańcucha pustego. R+ może być zapisany przy pomocy symbolu * jako RR*. R? może być zapisany jako (R ε). ~R - zbiór wszystkich słów z Σ*, które nie należą do R. Zapis tego zbioru może być bardziej skomplikowany. Standardy IEEE POSIX Basic Regular Expressions (BRE) oraz Extended Regular Expressions (ERE) Wyrażenia regularne w standardzie BRE posiadają symbole oraz następujące metasymbole i metasekwencje znaków:
. - oznacza dowolny pojedynczy symbol oprócz znaku nowej linii, w nawiasach kwadratowych oznacza po prostu kropkę [ ] - oznacza pojedynczy symbol, który jest zawarty w nawiasach, np [abc], [a-z]. Zauważmy, że nie ma możliwości zapisywania słów w nawiasach kwadratowych, jeśli - występuje tuż po nawiasie początkowym lub przed nawiasem końcowym to oznacza ona pauzę, aby uzyskać pauzę położoną wewnątrz nawiasów trzeba użyć strategii escapowania, to znaczy zamiast pauzy napisać \-. [^ ] - oznacza pojedynczy symbol, który nie jest zdefiniowany w nawiasach, np [^abc] - oznacza każdy symbol, który nie jest ani a, ani b, ani c. Np. [^a-z] oznacza wszystkie symbole, które nie są małymi literkami. ^ - oznacza początek łańcucha, kiedy analizujemy linie oznacza początek linii $ - oznacza koniec łańcucha, kiedy analizujemy linie oznacza koniec linii \ ( \) - oznaczone podwyrażenie (blok, grupa), napis wewnątrz tych nawiasów może być użyty później za pomocą odwołania \1,..., \9. \n - odwołanie do grupy, \1,..., \9, wykorzystanie odwołań powoduje, że dostajemy język, który nie jest regularny * - zero lub więcej razy poprzedzający element, np. ab*c oznacza {ac, abc, abbc,...}, [xyz]* oznacza {ε, x, y, z, zx, zyx,...},.* oznacza dowolny łańcuch \{m, n\} - oznacza wystąpienie od m do n razy poprzedzającego elementu: a\{3,\5} to {aaa, aaaa, aaaaa}. Przykłady: ^[hc]at - oznacza słowo hat lub cat występujące na początku linii. [hc]at$ - oznacza słowo hat lub cat występujące na końcu linii. Wyrażenia regularne w standardzie ERE. Różnice w stosunku do BRE. Brak możliwości używania grup.? - oznacza wystąpienie elementu poprzedzającego zero lub jeden raz, np ba? oznacza b lub ba. + - oznacza wystąpienie elementu poprzedzającego jeden lub więcej razy, np ba+ oznacza {ba, baa, baaa},.... - oznacza alternatywę np abc def oznacza {abc, def}. Przykłady: [hc]+at - oznacza {hat, cat, hhat, chat,...} [hc]?at - oznacza {hat, cat, at} Niektóre zakresy liczb lub liter można zapisywać za pomocą klasy definiowaniej w standardzie, przykładowo: [A-za-z] można zapisać jako [:alpha:] - oznacza znaki alfanumeryczne, [0-9] można zapisać jako [:digit:] - oznacza cyfry, itd Wyrażenia regularne w Perlu Wyrażenia regularne w Perlu są bardziej rozbudowane w porównaniu ze standardami BRE i ERE. Różnice: \ - escapowanie za pomocą \ oznacza zawsze znak nie alfanumeryczny. W perlu możliwe jest zdefiniowanie leniwego dopasowania, w przeciwieństwie do zachłannego dopasowania: dany łańcuch: ala <ma> <kota>,
zachłanne dopasowanie za pomocą wyrażenia <.*>: <ma> <kota>, leniwe dopasowanie za pomocą wyrażenia <.*>: <ma>. Jak inaczej osiągnąć łańcuch <ma>? Np. za pomocą wyrażenia <[^>]*>. Leniwe dopasowanie oznaczane jest jako <.*?>, znak zapytania po gwiazdce. W praktyce spotyka się wiele rozszerzeń wyrażeń regularnych. Takie wyrażenia z rozszerzeniami często nie dadzą się przedstawić w ogólności za pomocą wyrażenia regularnego, dlatego nazywa się je dla odróżnienia wzorcami, np wyrażenia z grupami nie da się przedstawić w ogólności za pomocą wyrażeń regularnych. Zastosowanie wyrażeń regularnych do operacji tekstowych 1. Wyszukiwanie linii, które zawierają co najmniej jedno słowo akceptowane przez wyrażenie regularne. 2. Zastępowanie słów w tekście akceptowanych przez dane wyrażenie regularne. 3. Sprawdzanie czy dane słowo jest akceptowane przez wyrażenie regularne. 4. Usuwanie linii zawierających słowa akceptowane przez dane wyrażenie regularne. 5. Usuwanie linii nie zawierających słowa akceptowanego przez dane wyrażenie regularne. 6. Usuwanie linii nie akceptowanych przez wyrażenie regularne. 7. Usuwanie linii akceptowanych przez wyrażenie regularne. Bibliografia 1. [Online] http://en.wikipedia.org/wiki/regular_expressions. 2. [Online] http://www.jflap.org/tutorial/regular/index.html.
Zadania Opis pliku comparisonfakepersonaldata.csv. W pliku tym w każdym wierszu znajdują sie wygenerowane dane dwóch osób. Lista narzędzi unixowych przydatnych do operacji na plikach tekstowych: grep, sed, uniq, split, sort, nl. Zadania na 3.0 a) Wypisać wszystkie porównania, dla których porównywane osoby mają to samo imię. b) Wypisać wszystkie porównania, dla których porównywane osoby mają to samo imię i nazwisko c) usunąć duplikaty z pliku comparisonfakepersonaldata.csv, duplikaty to każde dwa wiersze, zgodne na wszystkich polach oprócz pola id d) posortować wiersze według nazwiska pierwszej osoby Zadania na 4.0 a) dodac do każdego wiersza kolumny mówiące czy imiona dwóch osób są takie same, czy nazwiska dwóch osób są takie same, czy adresy dwóch osób są takie same. Zadania na 5.0 a) podzielić pola imię, nazwisko, ulica na tokeny, dla każdego test case'a dołączyć kolumnę z listą takich samych tokenów i różniących się na jednej literze. Użyć Perla. b) wyświetlić pary wierszy występujących obok siebie, które są zgodne na polach imię i nazwisko obu osób. Użyć do tego zadania skryptu sedowego z wykorzystaniem multilinii. Do zadań dołączone są następujące pliki: plik comparisonfakepersonaldata.csv, comparisonfakepersonaldata.txt - opis formatu pliku comparisonfakepersonaldata.csv.