Go to file
Jakub Pokrywka 2780e40506 fix 2022-01-17 00:12:58 +01:00
TaskA01 add A tasks 2021-10-10 21:15:21 +02:00
TaskA02 add A tasks 2021-10-10 21:15:21 +02:00
TaskA03 add A tasks 2021-10-10 21:15:21 +02:00
TaskA04 add A tasks 2021-10-10 21:15:21 +02:00
TaskB00 fix 2021-11-07 19:44:50 +01:00
TaskB01 add deterministic fsa 2021-10-23 18:29:55 +02:00
TaskB02 add deterministic fsa 2021-10-23 18:29:55 +02:00
TaskB03 add deterministic fsa 2021-10-23 18:29:55 +02:00
TaskB04 add deterministic fsa 2021-10-23 18:29:55 +02:00
TaskB05 add deterministic fsa 2021-10-23 18:29:55 +02:00
TaskB06 add deterministic fsa 2021-10-23 18:29:55 +02:00
TaskB07 add deterministic fsa 2021-10-23 18:29:55 +02:00
TaskB08 add deterministic fsa 2021-10-23 18:29:55 +02:00
TaskB09 fix 2021-11-07 19:44:50 +01:00
TaskC00 change deadline 2021-11-08 07:55:42 +01:00
TaskC01 change deadline 2021-11-08 07:55:42 +01:00
TaskC02 change deadline 2021-11-08 07:55:42 +01:00
TaskC03 change deadline 2021-11-08 07:55:42 +01:00
TaskC04 change deadline 2021-11-08 07:55:42 +01:00
TaskC05 change deadline 2021-11-08 07:55:42 +01:00
TaskC06 change deadline 2021-11-08 07:55:42 +01:00
TaskD01 add re tasks 2021-11-21 21:49:58 +01:00
TaskD02 add re tasks 2021-11-21 21:49:58 +01:00
TaskD03 add re tasks 2021-11-21 21:49:58 +01:00
TaskD04 add re tasks 2021-11-21 21:49:58 +01:00
TaskE00 add re tasks 2021-11-21 21:49:58 +01:00
TaskE01 add re tasks 2021-11-21 21:49:58 +01:00
TaskE02 add re tasks 2021-11-21 21:49:58 +01:00
TaskE03 add re tasks 2021-11-21 21:49:58 +01:00
TaskE04 add re tasks 2021-11-21 21:49:58 +01:00
TaskE05 add re tasks 2021-11-21 21:49:58 +01:00
TaskE06 add re tasks 2021-11-21 21:49:58 +01:00
TaskE07 add re tasks 2021-11-21 21:49:58 +01:00
TaskE08 add re tasks 2021-11-21 21:49:58 +01:00
TaskE09 add re tasks 2021-11-21 21:49:58 +01:00
TaskE10 add re tasks 2021-11-21 21:49:58 +01:00
TaskE11 add re tasks 2021-11-21 21:49:58 +01:00
TaskE12 add re tasks 2021-11-21 21:49:58 +01:00
TaskE13 add re tasks 2021-11-21 21:49:58 +01:00
TaskE14 add re tasks 2021-11-21 21:49:58 +01:00
TaskE15 add re tasks 2021-11-21 21:49:58 +01:00
TaskE16 add re tasks 2021-11-21 21:49:58 +01:00
TaskE17 add re tasks 2021-11-21 21:49:58 +01:00
TaskE18 add re tasks 2021-11-21 21:49:58 +01:00
TaskE19 add re tasks 2021-11-21 21:49:58 +01:00
TaskE20 add re tasks 2021-11-21 21:49:58 +01:00
TaskE21 add re tasks 2021-11-21 21:49:58 +01:00
TaskE22 add re tasks 2021-11-21 21:49:58 +01:00
TaskE23 add re tasks 2021-11-21 21:49:58 +01:00
TaskE24 add re tasks 2021-11-21 21:49:58 +01:00
TaskE25 add re tasks 2021-11-21 21:49:58 +01:00
TaskE26 add re tasks 2021-11-21 21:49:58 +01:00
TaskE27 add re tasks 2021-11-21 21:49:58 +01:00
TaskE28 add re tasks 2021-11-21 21:49:58 +01:00
TaskE29 add re tasks 2021-11-21 21:49:58 +01:00
TaskE30 add re tasks 2021-11-21 21:49:58 +01:00
TaskE31 add re tasks 2021-11-21 21:49:58 +01:00
TaskE32 add re tasks 2021-11-21 21:49:58 +01:00
TaskE33 add re tasks 2021-11-21 21:49:58 +01:00
TaskE34 add re tasks 2021-11-21 21:49:58 +01:00
TaskE35 add re tasks 2021-11-21 21:49:58 +01:00
TaskE36 add re tasks 2021-11-21 21:49:58 +01:00
TaskE37 add re tasks 2021-11-21 21:49:58 +01:00
TaskE38 add re tasks 2021-11-21 21:49:58 +01:00
TaskE39 add re tasks 2021-11-21 21:49:58 +01:00
TaskE40 add re tasks 2021-11-21 21:49:58 +01:00
TaskE41 add re tasks 2021-11-21 21:49:58 +01:00
TaskE42 add re tasks 2021-11-21 21:49:58 +01:00
TaskE43 add re tasks 2021-11-21 21:49:58 +01:00
TaskE44 add re tasks 2021-11-21 21:49:58 +01:00
TaskE45 add re tasks 2021-11-21 21:49:58 +01:00
TaskE46 add re tasks 2021-11-21 21:49:58 +01:00
TaskE47 add re tasks 2021-11-21 21:49:58 +01:00
TaskE48 add re tasks 2021-11-21 21:49:58 +01:00
TaskF00 add re 2 2021-12-05 18:52:04 +01:00
TaskF01 add re 2 2021-12-05 18:52:04 +01:00
TaskF02 add re 2 2021-12-05 18:52:04 +01:00
TaskF03 add re 2 2021-12-05 18:52:04 +01:00
TaskF04 add re 2 2021-12-05 18:52:04 +01:00
TaskF05 add re 2 2021-12-05 18:52:04 +01:00
TaskG00 fix polskie nazwiska/ 2021-12-30 15:46:09 +01:00
TaskG01 add Tasks G 2021-12-19 19:00:04 +01:00
TaskG02 add Tasks G 2021-12-19 19:00:04 +01:00
TaskG03 fix g03 2022-01-13 10:29:15 +01:00
TaskG04 fix bin and hex exp 2021-12-30 15:03:32 +01:00
TaskG05 fix bin and hex exp 2021-12-30 15:03:32 +01:00
TaskH00 add thrax 2021-12-31 13:21:12 +01:00
TaskH01 add thrax 2021-12-31 13:21:12 +01:00
TaskH02 add thrax 2021-12-31 13:21:12 +01:00
TaskH03 add thrax 2021-12-31 13:21:12 +01:00
TaskH04 add thrax 2021-12-31 13:21:12 +01:00
TaskH05 add thrax 2021-12-31 13:21:12 +01:00
TaskH06 add thrax 2021-12-31 13:21:12 +01:00
TaskH07 add thrax 2021-12-31 13:21:12 +01:00
TaskH08 add thrax 2021-12-31 13:21:12 +01:00
TaskH09 add thrax 2021-12-31 13:21:12 +01:00
TaskX01 add A tasks 2021-10-10 21:15:21 +02:00
TaskX02 add A tasks 2021-10-10 21:15:21 +02:00
TaskX03 init 2021-10-10 19:40:24 +02:00
.gitignore add deterministic fsa 2021-10-23 18:29:55 +02:00
README.md fix 2022-01-17 00:12:58 +01:00
compile_example.py add notes 2021-12-05 20:11:19 +01:00
daut2010.pdf add kolokwium 2022-01-17 00:11:30 +01:00
daut2010_odpowiedzi.pdf add kolokwium 2022-01-17 00:11:30 +01:00
daut2011.pdf add kolokwium 2022-01-17 00:11:30 +01:00
daut2011_odpowiedzi.pdf add kolokwium 2022-01-17 00:11:30 +01:00
run_report.py add thrax 2021-12-31 13:21:12 +01:00
thrax_example.grm fix 2022-01-02 21:44:12 +01:00

README.md

DJFZ 202/home/kuba/Syncthing/przedmioty/2021-01/djfz/djfz-2021/README.md1

Zajęcia 1 11.10.2021

Informacje na temat przedmiotu

Prowadzący: mgr Jakub Pokrywka mail: jp40407@st.amu.edu.pl

Dyżury: B1-46. Przed przyjściem proszę się umówić na spotkanie, najlepiej jest wysłać mi prywatną wiadomość na MS TEAMS.

W celu zaliczenia przedmiotu należy zdobyć punkty za zadania na laboratoriach oraz zaliczyć kolokwium. Punktowane zadania będziemy wykonywać na laboratoriach oraz po nich (przed następnymi zajęciami), ich ilość determinuje ocenę. Oprócz tego należy zaliczyć kolokwium z wyrażeń regularnych na ostatnich zajęciach. Sam wynik kolokwium nie będzie wpływał na ocenę, ale bez zdanego kolowkium nie da sie zaliczyć przedmiotu. Punktacja za zadania jest następująca:

  • mniej niż 30 punktów - 2
  • 30-34- 3
  • 35-39- 3.5
  • 40-44- 4
  • 45-49- 4.5
  • więcej niż 49- 5

Wysyłanie zadań

Proszę stworzyć prywatne repozytorium na https://git.wmi.amu.edu.pl/ o nazwie djfz-2021-sNRINDEKSU oraz dać prawa do odczytu użytkownikowi kubapok (prowadzący przedmiot). W NRINDEKSU proszę wpisać swój nr indeksu, np. djfz-2021-s123456.

Następnie w swoim repozytorium proszę spullować niniejsze repozytorium: git pull git@git.wmi.amu.edu.pl:kubapok/djfz-2021.git W ten sposób będziemy aktualizować zadania co zajęcia.

Proszę rozwiązać zadanie TASKX02 lub TASKX03 w zależności od numeru indeksu. W tym celu należy dodac plik run.py w odpowiednim katalogu. Za pomocą run_reports.py można sprwawdzić ilość punktów.

Do repo proszę dodawać wyłącznie plik run.py w odpowiednim katalogu, chyba że w zadaniu jest zaznaczone inaczej. Proszę również nie modyfikować innych plików.

Wszystkie zadania należy robić w terminie zaznaczonym w description.txt. Po terminie będę podawał punktację za pomocą USUSa w "sprawdziany".

Zadania robimy do końca soboty poprzedzającej zajęcia

Aktualizacja repozytorium

We własnym repozytorium:

git pull git@git.wmi.amu.edu.pl:kubapok/djfz-2021.git

Zajęcia 2 21.11.2021 Wyrażenia regularne

Dokumentacja wyrażeń regularnych w python3: 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)

Przykłady wyrażenia regularne 2 (objaśnienia na laboratoriach)

^

re.search('[0-9]+', '123-456-789')
re.search('[^0-9][0-9]+[^0-9]', '123-456-789')

cudzysłów

'' oraz "" - oznaczają to samo w pythonie

' ala ma psa o imieniu "Burek"'

" ala ma psa o imieniu 'Burek' "

' ala ma psa o imieniu 'Burek' '

" ala ma psa o imieniu "Burek" "

multiline string

raw string

przy raw string znaki \ traktowane są jako zwykłe znaki \

chociaż nawet w raw string nadal są escapowane (ale wtedy \ pozostają również w stringu bez zmian)

https://docs.python.org/3/reference/lexical_analysis.html

dobra praktyka - wszędzie escapować

'\\'
print('\\')

r'\\'
print(r'\\')


print("abcd")
print("ab\cd")
print(r"ab\cd")

print("ab\nd")
print(r"ab\nd")


print("\"")
print(r"\"")

print("\")
print(r"\")

re.search('\\', r'a\bc')
re.search(r'\\', r'a\bc')
re.search('\\\\', r'a\bc')

RE SUB

re.sub(pattern, replacement, string)

re.sub('a','b', 'ala ma kota')

backreferencje:


re.search(r' \d+ \d+', 'ala ma 41 41 kota')
re.search(r' \d+ \d+', 'ala ma 41 123 kota')
re.search(r' (\d+) \1', 'ala ma 41 41 kota')
re.search(r' (\d+) \1', 'ala ma 41 123 kota')

lookahead ( to sa takie assercje):

re.search(r'ma kot', 'ala ma kot')
re.search(r'ma kot(?=[ay])', 'ala ma kot')
re.search(r'ma kot(?=[ay])', 'ala ma kotka')
re.search(r'ma kot(?=[ay])', 'ala ma koty')
re.search(r'ma kot(?=[ay])', 'ala ma kota')

re.search(r'ma kot(?![ay])', 'ala ma kot')
re.search(r'ma kot(?![ay])', 'ala ma kotka')
re.search(r'ma kot(?![ay])', 'ala ma koty')
re.search(r'ma kot(?![ay])', 'ala ma kota')

named groups

r = re.search(r'ma (?P<ilepsow>\d+) kotow i (?P<ilekotow>\d+) psow', 'ala ma 100 kotow i 200 psow')
r.groups()
r.groups('ilepsow')
r.groups('ilekotow')

re.split

('a,b.c,d').split(',')
('a,b.c,d').split(',')
('a,b.c,d').split(',.')
re.split(r',', 'a,b.c,d') 
re.split(r'[.,]', 'a,b.c,d') 

\w word character

\w - matchuje Unicod word character , jeżeli flaga ASCII to [a-zA-Z0-9_]
\w - odwrotne do \W, jezeli flaga ASCI to [^a-zA-Z0-9_]

re.findall(r'\w+', 'ala ma 3 koty.')
re.findall(r'\W+', 'ala ma 3 koty.')

początek albo koniec słowa | word boundary

re.search(r'\bkot\b', 'Ala ma kota')
re.search(r'\bkot\b', 'Ala ma kot')
re.search(r'\bkot\b', 'Ala ma kot.')
re.search(r'\bkot\b', 'Ala ma kot ')

re.search(r'\Bot\B', 'Ala ma kot ')
re.search(r'\Bot\B', 'Ala ma kota ')

MULTILINE

re.findall(r'^Ma', 'Ma kota Ala\nMa psa Jacek') 
re.findall(r'^Ma', 'Ma kota Ala\nMa psa Jacek', re.MULTILINE)

RE.COMPILE

zajęcia 6

instalacja https://pypi.org/project/google-re2/

DFA i NDFA

import re2 as re
n = 50
regexp =  "a?"*n+"a"*n
s = "a"*n
re.match(regexp, s)
re.match(r"(\d)abc\1", "3abc3") # re2 nie obsługuje backreferencji

re2 max memory - podniesienie limitu time # mierzenie czasu działania

gdyby ktoś chciał poczytać więcej: https://swtch.com/~rsc/regexp/regexp1.html

UTF-8

c = ""
ord(c)
chr(8459)
8* 16**2 + 0 * 16**(1) + 0*16**(0)
15*16**3 + 15* 16**2 + 15 * 16**(1) + 15*16**(0)
xxd -b file
xxd  file

termin oddawania zadań - 15. listopada

Zajęcia 7

https://www.openfst.org/twiki/bin/view/GRM/Thrax

https://www.cs.jhu.edu/~jason/465/hw-ofst/hw-ofst.pdf

Wszystkie zadania proszę robić na wzór TaskH00. Proszę umieszczać gramatykę w pliku grammar.grm oraz opisywać finalną regułę nazwą FinalRule.

KOLOKWIUM

Operatory, obowiązujące na kolokwium

  • kwantyfikatory - * + ? {n} {n,} {n, m}
  • alternatywa — |
  • klasy znaków — [...]
  • zanegowane klasy znaków — [^...]
  • dowolny znak — .
  • unieważnianie znaków specjalnych — \
  • operatory zakotwiczające — ^ $

Na kolokwium do każdego z 4 pytań będą 3 podpunkty. Na każdy podpunkt odpowiadamy TAK/NIE. Czas trwania to 15 minut.

  • zawsze daszek i dolar
  • nie bierzemy pod uwagę capturing (jeżeli są pytania o równoważne)
  • proponuję wydrukować cały test w wersji bez opdowiedzi i sprawdzać

Do zaliczenia należy zdobyć conajmniej 10 punktów.