157 lines
4.2 KiB
Markdown
157 lines
4.2 KiB
Markdown
# 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)
|
|
``` |