"""Regul?re uttrykk i Python Forenkelt: Hent ut dagene fra datoene. """ import re ##### MED ?N STRENG: ##### # re.findall(m?nstret, streng): finner alle matcher i en streng dato_streng = 'mandag 6/12 tirsdag 30/5 onsdag 36/12 torsdag 25/14 januar 01/01 l?rdag 1/5 s?ndag 07/07' ru = r"(man|tirs|ons|tors|fre|l?r|s?n)dag" # Matcher bare dager matcher = re.findall(ru, dato_streng) print("Teoretisk riktig uttrykk resultat:", matcher) # Hvordan ser det ut? # NOTE: Programmet finner en match p? den f?rste gruppe og avslutter ? s?ke. # Derfor vil bare den f?rste gruppe fanges selv om teorien er riktig og det # ville v?rt riktig p? eksamen. # >> ['man', 'tirs', 'ons', 'tors', 'l?r', 's?n'] ################################################################################ ##### L?SNING 1 ##### # Sett "dag" i en gruppe (dvs. med parenteser) og sette resultatene sammen ru_med_grupper = r"(man|tirs|ons|tors|fre|l?r|s?n)(dag)" matcher_tupler = re.findall(ru_med_grupper, dato_streng) print("\nMatch med 2 grupper:", matcher_tupler) # >> [('man', 'dag'), ('tirs', 'dag'), ('ons', 'dag'), ('tors', 'dag'), ('l?r', 'dag'), ('s?n', 'dag')] matcher_joined = [] for match in matcher_tupler: # tupler match_join = "".join(match) matcher_joined.append(match_join) print("\nJoined Matcher:", matcher_joined) # >> ['mandag', 'tirsdag', 'onsdag', 'torsdag', 'l?rdag', 's?ndag'] ##### L?SNING 2 ##### # Bruk ikke-fangende gruppe (eng. non-capturing group) # Forteller python ? ikke slutte ? s?ke etter den f?rste gruppen er en match ru_non_capturing = r"(?:man|tirs|ons|tors|fre|l?r|s?n)dag" matcher = re.findall(ru_non_capturing, dato_streng) print("\nNon-Capturing Group:", matcher) # >> ['mandag', 'tirsdag', 'onsdag', 'torsdag', 'l?rdag', 's?ndag'] ################################################################################ ##### MED EN LISTE AV STRENGER ##### # N?r dataen er delt opp i strenger og lagret i en liste: # en l?kke + re.match()/re.fullmatch() # - re.match(uttrykk, streng): uttrykket finnes i en del av strengen (delvis match) # - re.match(uttrykk, streng): uttrykket matcher hele strengen dato_liste = ['mandag 6/12', 'tirsdag 30/5', 'onsdag 36/12', 'torsdag 25/14', 'januar 01/01', 'l?rdag 1/5', 's?ndag 07/07', 'fredag' ] ru = r"(man|tirs|ons|tors|fre|l?r|s?n)(dag)" # Matcher bare dager delvis_matcher = [] matcher = [] for dato in dato_liste: if re.match(ru, dato): # Om en del av strengen matcher uttrykket delvis_matcher.append(dato) if re.fullmatch(ru, dato):# Om hele strengen matcher uttrykket matcher.append(dato) # NOTE: hele stengen settes i listen, ikke matchen # (dvs. ikke det som returneres av re.match()/re.fullmatch()) print("\nDelvis match", delvis_matcher) print("\nHel Match:", matcher) # NOTE: "fredag" forekommer i begge resultatene