12. Wyrażenia regularne

12.1. Konstruowanie wyrażeń

12.2. Wyciąganie parametrów (zmiennych)

def sprwadzie_ciagow():
    REGEX_IMIE_I_NAZWISKO = r"(?P<first_name>\w+) (?P<last_name>\w+)"

    imie_i_nazwisko = re.compile(REGEX_IMIE_I_NAZWISKO)
    m = imie_i_nazwisko.match('Malcolm Reynolds')

    m.group('first_name')
    'Malcolm'
    m.group('last_name')
    'Reynolds'
    m.group()
    'Malcolm Reynolds'

12.3. Najczęściej wykorzystywane funkcje

12.3.1. match()

Code Listing 12.17. Usage of re.match()
import re

POPRAWNY_EMAIL = r'(^[a-z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)'


def email_poprawny(email):
    if re.match(POPRAWNY_EMAIL, email):
        print('Poprawny:', email)
        return True
    else:
        print('Niepoprawny:', email)
        return False


email_poprawny('Amatt@astrotech.io')
email_poprawny('matt@astrotech.io')
email_poprawny('+matt@astrotech.io')
email_poprawny('matt+@astrotech.io')
email_poprawny('mattastrotech@.io')

12.3.3. findall() i finditer()

Code Listing 12.19. Usage of re.findall() and re.finditer()
import re

PATTERN = r'[A-Z]{2,10}-[0-9]+'  # used for JIRA issue id
PATTERN = r'#[0-9]+'  # used for redmine and track issue id


COMMIT_MESSAGE = "Refs #23919, #31337 -- Removed obsolete comments about u'' prefixes."


issues = re.compile(PATTERN)
issues.findall(COMMIT_MESSAGE)
# ['#23919', '#31337']

re.findall(issues, COMMIT_MESSAGE)
# ['#23919', '#31337']

12.3.4. compile()

12.3.5. MULTILINE

Code Listing 12.20. Usage of regexp
import re


COMMIT_MESSAGE = """Fixed #27533 -- Fixed inspectdb crash if a unique constraint uses an … #31337
 …unsupported type."""

re.findall(r'#[0-9]+', COMMIT_MESSAGE, flags=re.MULTILINE)
# ['#23919', '#31337']

issues = re.compile(r'#[0-9]+', flags=re.MULTILINE)
issues.findall(COMMIT_MESSAGE)
# ['#23919', '#31337']

12.5. Przykład

import re

TEKST = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. -- Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC"""


SLOWA_ZAWIERAJACE_IS = r'[a-zA-Z0-9]*is[a-zA-Z0-9]*'
wynik = re.findall(SLOWA_ZAWIERAJACE_IS, TEKST)
print(wynik)

SLOWA_ZAWIERAJACE_IS = re.compile(r'[a-zA-Z0-9]*is[a-zA-Z0-9]*')
SLOWA_ZAWIERAJACE_IS.findall(TEKST)
print(wynik)

12.5.1. Wizualizacja regexpów

https://regexper.com/

../_images/regexp-vizualization.png

12.6. Zadania kontrolne

12.6.1. Walidacja PESEL

Za pomocą wyrażeń regularnych sprawdź:

  • czy pesel jest poprawny
  • jaka jest data urodzenia? (podaj obiekt datetime.date
  • płeć użytkownika który podał PESEL
Z gwiazdką:
  • sprawdź walidację numerów PESEL dla osób urodzonych po 2000 roku.
  • sprawdź sumę kontrolną