djfz-2020-info/laboratoria2/info.md

4.4 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('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)