djfz-2020-info/laboratoria2/info.md

155 lines
4.1 KiB
Markdown
Raw Normal View History

2020-11-09 11:15:51 +01:00
# DJFZ 2020 laboratoria 2
2020-11-09 13:37:47 +01:00
## Uaktualnienie repo
Na początku proszę uaktualnić swoje repo. Są nowe zadania.
`git pull git@git.wmi.amu.edu.pl:filipg/djfz-2020.git`
2020-11-09 11:15:51 +01:00
## 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
2020-11-09 17:13:13 +01:00
2020-11-09 11:15:51 +01:00
findall - zwraca listę wszystkich dopasowań (nienakładających się na siebie)
2020-11-09 17:13:13 +01:00
2020-11-09 11:15:51 +01:00
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
2020-11-09 14:46:23 +01:00
- ? - znak występuje lub nie występuje
2020-11-09 11:15:51 +01:00
- \* - 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)
2020-11-09 14:46:23 +01:00
re.findall('[a-z][a-z]ma[a-z]',text)
2020-11-09 11:15:51 +01:00
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)
2020-11-09 14:46:23 +01:00
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')
2020-11-09 11:15:51 +01:00
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)
```