pjn-2024-cw/02_wyrazenia_regularne.ipynb
2024-10-23 16:51:53 +02:00

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