153 lines
5.7 KiB
Plaintext
153 lines
5.7 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Zajęcia 2: Wyrażenia regularne\n",
|
|
"\n",
|
|
"Wszystkie zadania ćwiczeniowe należy rozwiązywać w języku Python w kopii Jupyter Notebook'a dla danych zajęć w wyznaczonych miejscach (komórki z komentarzem `# Solution`).\n",
|
|
"\n",
|
|
"Nie należy usuwać komórek z treścią zadań.\n",
|
|
"\n",
|
|
"Należy wyświetlać outputy przy pomocy `print`\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Istnieją 2 moduły do wykorzystania wyrażeń regularnych w Pythonie: `re` oraz `regex`\n",
|
|
"\n",
|
|
"Moduł `re` jest częścią standardowej biblioteki języka Python, natomiast `regex` stanowi osobny moduł, który należy zainstalować, by móc z niego korzystać. Moduł `re` jest prostszy i będzie wykorzystywany na potrzeby tych zajęć.\n",
|
|
"\n",
|
|
"Dokumentacja: https://docs.python.org/3/library/re.html\n",
|
|
"\n",
|
|
"Dla chętnych: wyzwanie uczenia maszynowego, w którym można było zastosować wyrażenia regularne https://www.kaggle.com/c/pii-detection-removal-from-educational-data "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Zadanie 1\n",
|
|
"Napisz funkcje wykorzystujące wyrażenia regularne do walidacji danych osobowych. Funkcje muszą zwrócić wartość `True`, gdy walidacja przejdzie pomyślnie, a w przeciwnym wypadku wartość `False`. Uwaga: funkcja nie ma sprawdzać, czy w danym tekście znajduje się dany rodzaj danych, tylko czy w pełni stanowi dany obiekt (np. tekst \"Imię: Adam\" albo \"Adam to szef\" nie powinien przejść walidacji). Funkcje do napisania:\n",
|
|
"* Funkcja walidująca imię (minimum 2 litery, zaczyna się wielką literą, pozostałe litery są małe, nie zawiera innych znaków oprócz liter)\n",
|
|
"* Funkcja walidująca nr telefonu w formacie (XX) XXX-XX-XX (np. (61) 222-45-56)\n",
|
|
"* Funkcja walidująca kod pocztowy XX-XXX (np. 61-620)\n",
|
|
"* Funkcja walidująca adres email (uproszczone założenia: pierwsza część składa się z liter i cyfr, potem mamy symbol \"@\", następnie domenę składającą się z liter, dalej symbol \".\" i na końcu ciąg liter od 2 do 6 znaków)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Solution 1\n",
|
|
"\n",
|
|
"def validate_name(text):\n",
|
|
" pass\n",
|
|
"\n",
|
|
"\n",
|
|
"def validate_phone_number(phone_number):\n",
|
|
" pass\n",
|
|
"\n",
|
|
"\n",
|
|
"def validate_zip_code(zip_code):\n",
|
|
" pass\n",
|
|
"\n",
|
|
"\n",
|
|
"def validate_email(email):\n",
|
|
" pass\n",
|
|
"\n",
|
|
"\n",
|
|
"names = [\"Adam\", \"Ewa\", \"adam\", \"maciek15pl\", \"y\", \"ka$ia\", \"Adam to szef\", \"adam To szef\"]\n",
|
|
"phone_numbers = [\"(61) 222-45-56\", \"telefon: (61) 222-45-56\", \"23 123-25-64\", \"(61) 5312-53-1\", \"(00 1110022)\"]\n",
|
|
"zip_codes = [\"61-620\", \"63-125 \", \"12345\", \"125-21\"]\n",
|
|
"emails = [\"sigmaboy@sigma.pl\", \"superbohater2008@gmail.com\", \"bieg@cz@gmail.com\", \".slodkipiesek.@pieskowo.eu\", \"@do.it\"]\n",
|
|
"\n",
|
|
"\n",
|
|
"print(\"NAMES\")\n",
|
|
"for name in names:\n",
|
|
" print(f\"{name}: {validate_name(name)}\")\n",
|
|
"\n",
|
|
"print(\"PHONE NUMBERS\")\n",
|
|
"for phone_number in phone_numbers:\n",
|
|
" print(f\"{phone_number}: {validate_phone_number(phone_number)}\")\n",
|
|
"\n",
|
|
"print(\"ZIP CODES\")\n",
|
|
"for code in zip_codes:\n",
|
|
" print(f\"{code}: {validate_zip_code(code)}\")\n",
|
|
"\n",
|
|
"print(\"EMAILS\")\n",
|
|
"for email in emails:\n",
|
|
" print(f\"{email}: {validate_email(email)}\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Zadanie 2\n",
|
|
"Napisz funkcję, która podzieli tekst na zdania. Zdanie kończy się kropką, znakiem zapytania lub wykrzyknikiem. Podzielone zdania muszą zachować pierwotną interpunkcję (czyli po podziale kropka/wykrzyknik/znak zapytania muszą występować w rozdzielonych od siebie zdaniach). Wykorzystaj pojedynczy pattern z wyrażeń regularnych. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Solution 2\n",
|
|
"\n",
|
|
"def split_sentences(text):\n",
|
|
" pass"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Zadanie 3\n",
|
|
"Napisz funkcję, który znajdzie w tekście jak największą liczbę wulgaryzmów i zastąpi je ciągiem znaków \"---\" (i zwróci tekst bez wulgaryzmów). Użyj wyrażeń regularnych. Pamiętaj, że wulgaryzmy odmieniają się przez przypadki oraz tworzy się z nich czasowniki, które również można uznać za wulgaryzmy. Przetestuj program na prawdziwym tekście (minimum 500 znaków) zawierającym różne wulgaryzmy (np. jakaś wypowiedź z forum internetowego).\n",
|
|
"\n",
|
|
"Nie wolno stosować długiej listy słów odmienionych w różny sposób jako pattern, należy użyć relatywnie niedużej listy i zastosować odpowiedni pattern pokrywający różne odmiany danego słowa."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Solution 3\n",
|
|
"\n",
|
|
"def censor_text(text):\n",
|
|
" pass"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "base",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.11.5"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|