4.1 KiB
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
-
? - znak występuje lub nie występuje
-
* - 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('ma \d? bananów','Ala ma 5 bananów')
re.search('ma ?\d? bananów','Ala ma bananów')
re.search('ma( \d)? bananów','Ala ma bananów')
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('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)