Go to file
2024-01-29 21:35:28 +01:00
.idea commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskB00 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskB01 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskB02 update 2023-12-17 21:57:42 +01:00
TaskB03 as 2023-11-19 22:42:11 +01:00
TaskB04 as 2023-11-19 22:42:11 +01:00
TaskB05 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskB06 as 2023-11-19 22:42:11 +01:00
TaskB07 F .in update ehhh 2024-01-13 23:20:30 +01:00
TaskB08 as 2023-11-19 22:42:11 +01:00
TaskB09 as 2023-11-19 22:42:11 +01:00
TaskC00 F 2024-01-07 21:21:03 +01:00
TaskC01 as 2023-11-19 22:42:11 +01:00
TaskC02 as 2023-11-19 22:42:11 +01:00
TaskC03 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskC04 as 2023-11-19 22:42:11 +01:00
TaskC05 as 2023-11-19 22:42:11 +01:00
TaskC06 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskD01 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskD02 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskD03 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskD04 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskE00 update 2023-12-17 21:57:42 +01:00
TaskE01 update 2023-12-17 21:57:42 +01:00
TaskE02 update 2023-12-17 21:57:42 +01:00
TaskE03 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskE04 update 2023-12-17 21:57:42 +01:00
TaskE05 update 2023-12-17 21:57:42 +01:00
TaskE06 update 2023-12-17 21:57:42 +01:00
TaskE07 update 2023-12-17 21:57:42 +01:00
TaskE08 update 2023-12-17 21:57:42 +01:00
TaskE09 update 2023-12-17 21:57:42 +01:00
TaskE10 update 2023-12-17 21:57:42 +01:00
TaskE11 update 2023-12-17 21:57:42 +01:00
TaskE12 update 2023-12-17 21:57:42 +01:00
TaskE13 update 2023-12-17 21:57:42 +01:00
TaskE14 update 2023-12-17 21:57:42 +01:00
TaskE15 update 2023-12-17 21:57:42 +01:00
TaskE16 update 2023-12-17 21:57:42 +01:00
TaskE17 update 2023-12-17 21:57:42 +01:00
TaskE18 update 2023-12-17 21:57:42 +01:00
TaskE19 update 2023-12-17 21:57:42 +01:00
TaskE20 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskE21 update 2023-12-17 21:57:42 +01:00
TaskE22 update 2023-12-17 21:57:42 +01:00
TaskE23 update 2023-12-17 21:57:42 +01:00
TaskE24 update 2023-12-17 21:57:42 +01:00
TaskE25 update 2023-12-17 21:57:42 +01:00
TaskE26 update 2023-12-17 21:57:42 +01:00
TaskE27 update 2023-12-17 21:57:42 +01:00
TaskE28 update 2023-12-17 21:57:42 +01:00
TaskE29 update 2023-12-17 21:57:42 +01:00
TaskE30 update 2023-12-17 21:57:42 +01:00
TaskE31 update 2023-12-17 21:57:42 +01:00
TaskE32 update 2023-12-17 21:57:42 +01:00
TaskE33 update 2023-12-17 21:57:42 +01:00
TaskE34 update 2023-12-17 21:57:42 +01:00
TaskE35 update 2023-12-17 21:57:42 +01:00
TaskE36 update 2023-12-17 21:57:42 +01:00
TaskE37 update 2023-12-17 21:57:42 +01:00
TaskE38 update 2023-12-17 21:57:42 +01:00
TaskE39 update 2023-12-17 21:57:42 +01:00
TaskE40 update 2023-12-17 21:57:42 +01:00
TaskE41 update 2023-12-17 21:57:42 +01:00
TaskE42 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskE43 update 2023-12-17 21:57:42 +01:00
TaskE44 update 2023-12-17 21:57:42 +01:00
TaskE45 update 2023-12-17 21:57:42 +01:00
TaskE46 update 2023-12-17 21:57:42 +01:00
TaskE47 update 2023-12-17 21:57:42 +01:00
TaskE48 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskF00 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskF01 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskF02 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskF03 F fixes 2024-01-14 17:25:11 +01:00
TaskF04 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskF05 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskG00 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskG01 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskG02 F fixes 2024-01-14 17:25:11 +01:00
TaskG03 F fixes 2024-01-14 17:25:11 +01:00
TaskG04 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskG05 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskX01 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
TaskX02 as 2023-11-19 22:42:11 +01:00
TaskX03 commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00
daut2010_odpowiedzi.pdf F fixes 2024-01-14 17:25:11 +01:00
daut2010.pdf F fixes 2024-01-14 17:25:11 +01:00
daut2011_odpowiedzi.pdf F fixes 2024-01-14 17:25:11 +01:00
daut2011.pdf F fixes 2024-01-14 17:25:11 +01:00
README.md F fixes 2024-01-14 17:25:11 +01:00
run_report.py commit ktory powinien powstac tydzien temu 2024-01-29 21:35:28 +01:00

Zajęcia 1 16.10.2023

Informacje na temat przedmiotu

Prowadzący: mgr inż. Bartosz Fijałkowski mail: bf55466@st.amu.edu.pl

Gdyby była potrzeba przedyskutowania czegoś to możemy zostać po zajęciach. Można też kontaktować się ze mną mailowo.

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 kolokwium nie da się zaliczyć przedmiotu. Punktacja za zadania jest następująca:

  • mniej niż 29 punktów - 2
  • 29-33- 3
  • 34-38- 3.5
  • 39-43- 4
  • 44-48- 4.5
  • więcej niż 48- 5

Wysyłanie zadań

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

Następnie w swoim repozytorium proszę zforkować niniejsze repozytorium: git pull git@git.wmi.amu.edu.pl:bfijalkowski/DJFZ-2023.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 dodać plik run.py w odpowiednim katalogu. Za pomocą run_reports.py można sprawdzić 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ą USOSa w "sprawdziany".

Zadania robimy do dnia poprzedzającego następne zajęcia.

Aktualizacja repozytorium

We własnym repozytorium:

git pull git@git.wmi.amu.edu.pl:bfijalkowski/DJFZ-2023.git

Zajęcia 1 16.10.2023 Automaty deterministyczne skończone

B00 - zadanie wykonywane wspólnie na zajęciach B01-B04, B06-B09 - po jedno dla każdego B05 - jedno dla wszystkich

Zajęcia 2 30.10.2023 Automaty niedeterministyczne skończone

C00 - zadanie wykonywane wspólnie na zajęciach C01-C03, C04-C06 - po jedno dla każdego

Zajęcia 3 13.11.2023 Wyrażenia regularne

D01 - D04 - do wykonania przez każdego

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(type(answer))
print(answer.start())
print(answer.end())
print(answer.group())

answer = re.search('na','kabanos')
print(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)

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

Zajęcia 4 27.11.2023 Wyrażenia regularne 2

E00 - E09 - po jedno dla każdego

E10 - E36 - po jedno dla każdego

E37 - E43 - po jedno dla każdego

E44 - E48 - po jedno dla każdego

Zajęcia 5 11.12.2023 Wyrażenia regularne 3

F00 - F05 - do wykonania przez każdego

Proszę o przekopiowanie sobie pliku polish_wiki_excerpt.in z zadania F00 do katalogów z pozostałymi zadaniami

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)

F00 - F05 - do wykonania przez każdego

Zajęcia 6 8.01.2024 Kodowanie i re2

Proszę o przekopiowanie sobie pliku polish_wiki_excerpt.in z zadania F00 do katalogów G00, G03.

Instalacja biblioteki re2: 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

setting = re2.Options()
setting.max_mem = 1 << 30 # to jest rozmiar podany w bajtach, czyli tutaj 1GB - to jest maksimum o ile możemy podnieść limit
pattern = re2.compile(regexp, setting)

time # mierzenie czasu działania

start = time.time()
withre2()
d1 = t1ime.time() - start
print(f'That took {d1:.2f} seconds.\n')

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

KOLOKWIUM 2024-01-22

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 — ^ $

W repozytorium znajdują się przykładowe pliki z zadaniami.