5.7 KiB
Zajęcia 2: Wyrażenia regularne
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
).
Nie należy usuwać komórek z treścią zadań.
Należy wyświetlać outputy przy pomocy print
Istnieją 2 moduły do wykorzystania wyrażeń regularnych w Pythonie: re
oraz regex
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ęć.
Dokumentacja: https://docs.python.org/3/library/re.html
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
Zadanie 1
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:
- 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)
- Funkcja walidująca nr telefonu w formacie (XX) XXX-XX-XX (np. (61) 222-45-56)
- Funkcja walidująca kod pocztowy XX-XXX (np. 61-620)
- 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)
# Solution 1
def validate_name(text):
pass
def validate_phone_number(phone_number):
pass
def validate_zip_code(zip_code):
pass
def validate_email(email):
pass
names = ["Adam", "Ewa", "adam", "maciek15pl", "y", "ka$ia", "Adam to szef", "adam To szef"]
phone_numbers = ["(61) 222-45-56", "telefon: (61) 222-45-56", "23 123-25-64", "(61) 5312-53-1", "(00 1110022)"]
zip_codes = ["61-620", "63-125 ", "12345", "125-21"]
emails = ["sigmaboy@sigma.pl", "superbohater2008@gmail.com", "bieg@cz@gmail.com", ".slodkipiesek.@pieskowo.eu", "@do.it"]
print("NAMES")
for name in names:
print(f"{name}: {validate_name(name)}")
print("PHONE NUMBERS")
for phone_number in phone_numbers:
print(f"{phone_number}: {validate_phone_number(phone_number)}")
print("ZIP CODES")
for code in zip_codes:
print(f"{code}: {validate_zip_code(code)}")
print("EMAILS")
for email in emails:
print(f"{email}: {validate_email(email)}")
Zadanie 2
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.
# Solution 2
def split_sentences(text):
pass
Zadanie 3
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).
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.
# Solution 3
def censor_text(text):
pass