# DJFZ 2020 laboratoria 2 ## Uaktualnienie repo Na początku proszę uaktualnić swoje repo. Są nowe zadania. `git pull git@git.wmi.amu.edu.pl:filipg/djfz-2020.git` ## Zadania do samodzielnego wykonania Zadania z działu B i C — wyrażenia regularne. Deadline do końca dnia 22 listopada. Proszę zrobić wszystkie zadania B. To te same zadania co A, różnią się sposobem właściwego wykonania. Tym razem proszę użyć wyrażeń regularnych. Przy pisaniu rozwiązań proszę zwrócić uwagę na stopień skomplikowania i czas wykonania rozwiązań z wyrażeniami regularynymi (B) względem rozwiązań opierających się na podstawowych mechanizmach (A). Każdemu z Państwa przypadają dokładnie 4 zadania (łącznie te zadania będą stanowiły „zadanie łatwe” z działu C, aczkolwiek nie trzeba ich wszystkich zrobić). Uwaga: które zadanie przypadają, zależy od numeru indeksu! Zadania są mianowicie pogrupowane w 4 bloki: - TaskC00—TaskC09 — reszta z dzielenia przez 10, - TaskC10—TaskC36 — reszta z dzielenia przez 27, - TaskC37—TaskC43 — reszta z dzielenia przez 7, - TaskC44—TaskC48 — reszta z dzielenia przez 5. Proszę sprawdzić w repozytorium, które zadanie z każdego bloku jest przyporządkowane Państwu. Zatem każdemu z Państwa przypada dokładnie jedno zadanie z każdego z tych 4 bloków. Do zdobycia za drugie laboratoria jest łącznie 16 punktów. ## Wyrażenia regularne Wyrażenia regularne będziemy robić na podstawie języka python3. Dokumentacja: https://docs.python.org/3/library/re.html ### Podstawowe funkcje search - zwraca pierwsze dopasowanie w napisie findall - zwraca listę wszystkich dopasowań (nienakładających się na siebie) match - zwraca dopasowanie od początku string To tylko podstawowe funkcje, z których będziemy korzystać. W dokumentacji opisane są wszystkie. ### Obiekt match ``` import re answer = re.search('na','banan') print(answer) print(answer.start()) print(answer.end()) print(answer.group()) answer = re.search('na','kabanos') print(answer) type(answer) if answer: print(answer.group()) else: pass ``` ### Metaznaki - [] - zbiór znaków - . - jakikolwiek znak - ^ - początek napisu - $ - koniec napisu - \* - zero albo więcej pojawień się - \+ - jeden albo więcej pojawień się - {} - dokładnie tyle pojawień się - | - lub - () - grupa - \ -znak ucieczki - \d digit - \D nie digit - \s whitespace - \S niewhitespace ### Flagi Można użyć specjalnych flag, np: `re.search('ma', 'AlA Ma KoTa', re.IGNORECASE)`. ### Przykłady (objaśnienia na laboratoriach) Do nauki lepiej użyć pythona w wersji interaktywnej, a najlepiej ipython. ``` import re text = 'Ala ma kota i hamak, oraz 150 bananów.' re.search('ma',text) re.match('ma',text) re.match('Ala ma',text) re.findall('ma',text) re.findall('[mn]a',text) re.findall('[0-9]',text) re.findall('[0-9abc]',text) re.findall('[a-z][a-z]ma[a-z]',text re.findall('[a-zA-Z][a-zA-Z]ma[a-zA-z0-9]',text) re.findall('\d',text) re.search('[0-9][0-9][0-9]',text) re.search('[\d][\d][\d]',text) re.search('\d{2}',text) re.search('\d{3}',text) re.search('\d+',text) re.search('\d+ bananów',text) re.search('\d* bananów','Ala ma dużo bananów') re.search('\d* bananów',text) re.search('\d+ bananów','Ala ma 10 bananów albo 20 bananów') re.search('\d+ bananów$','Ala ma 10 bananów albo 20 bananów') text = 'Ala ma kota i hamak, oraz 150 bananów.' re.search('\d+ bananów',text) re.search('\d+\sbananów',text) re.search('kota . hamak',text) re.search('kota . hamak','Ala ma kota z hamakiem') re.search('kota .* hamak','Ala ma kota lub hamak') re.search('\.',text) re.search('kota|psa','Ala ma kota lub hamak') re.findall('kota|psa','Ala ma kota lub psa') re.search('kota (i|lub) psa','Ala ma kota lub psa') re.search('ma (kota)','Ja mam kota. Ala ma kota.') re.search('ma (kota)','Ja mam kota. Ala ma kota.').group(0) re.search('ma (kota)','Ja mam kota. Ala ma kota.').group(1) re.search('mam (kota).*(kota|psa)','Ja mam kota. Ala ma psa.') re.search('mam (kota).*(kota|psa)','Ja mam kota. Ala ma psa.').group(0) re.search('mam (kota).*(kota|psa)','Ja mam kota. Ala ma psa.').group(1) re.search('mam (kota).*(kota|psa)','Ja mam kota. Ala ma psa.').group(2) ```