Linguistica Computazionale Laboratorio espressioni regolari (2) 09 ottobre 2014 Esercizi Formalizzare con le espressioni regolari i patterns per trovare le seguenti stringhe: “tutte le vocali minuscole o maiuscole“ Esercizi (1) "le parole che iniziano per consonante“: “le parole che terminano con un segno di punteggiatura (es. "cane," "finito;" ecc.)”: r‘\s[qwrtupsdfghjklzxcvbnm]\w*|\s[QWRTYPSDFGHJKL ZXCVBNM]\w*‘ r'\w+[,;.:?!]\s‘ “Il passato prossimo del verbo mangiare“ r‘\sho\smangiato|\shai\smangiato|\sha\smangiato|\sabbi amo\smangiato|\savete\smangiato|\shanno\smangiato|\ sHo\smangiato|\sHai\smangiato|\sHa\smangiato|\sAbbia mo\smangiato|\sAvete\smangiato|\sHanno\smangiato‘ Esercizi (2) “le parole che iniziano per ‘tar’ o per ‘tr’”: “le date in cui giorno, mese e anno sono tutti espressi da numeri“: r‘\star\w*|\str\w*’ r‘\s\d\d[-/]\d\d[-/]\d\d\d\d‘ r‘\s[0-3]?\d[-/][01]?\d[-/][0-2]?\d?\d?\d\s' Usando l’operatore di sostituzione "verticalizzate” le parole, in modo che ogni parola venga scritta su una riga diversa: NuovaFrase=re.sub(r‘ ’, r‘\n’, frase) Wildcard La RE r‘.’ corrisponde a qualsiasi carattere (eccetto il ritorno-a-capo) RE Definizione Esempi di “matching” r’b.s’ qualsiasi stringa di tre caratteri che inizia con ‘b’ e termina con ‘s’ “bas” “bbs” “b3s” “b!s” “b s” “b,s” … qualsiasi stringa che inizia per b e termina per s “bs” “bas” “bbs” “b3s” “b!s” “b s” “b,s” “baas” r’b.*s’ “baas” “bisogna prendere l’autobus” r‘.*’ qualsiasi stringa (compresa quella vuota) una intera riga di testo Ingordigia e pigrizia I moltiplicatori in Python sono ingordi (greedy) fanno sempre matching con la stringa più lunga possibile r’x+’ “axxxxxxxb” “axxxxxxxb” r’a.*c’ “a xxx c xxx c xxx d” “a xxx c xxx c xxx d” E’ possibile rendere i moltiplicatori “pigri” (lazy) facendoli seguire dal carattere “?” fanno matching con la stringa più corta possibile r’a.*?c’ “a xxx c xxx c xxx d” “a xxx c xxx c xxx d” Raggruppamento e memoria Le parentesi tonde (seguite dai simboli ‘?:’) servono per raggruppare stringhe di caratteri da moltiplicare: RE Definizione Esempi di “matching” r’(?:ab)+’ una o più stringhe “ab” “ab” “abab” “ababab” r’ab+’ una “a” seguito da una o più “b” “ab” “abb” “abbb” Le parentesi tonde (senza ‘?:’) memorizzano la stringa di testo corrispondente al contenuto delle parentesi: - la stringa viene memorizzata in una variabile temporanea - Il contenuto della variabile può essere richiamato con \<numero> - 1 = contenuto della prima coppia di parentesi; 2 = contenuto della seconda coppia di patentesi, ecc. Raggruppamento e memoria RE Definizione Esempi di “matching” r’((?:ab)+)\1’ la variabile “\1” corrisponde a qualunque stringa abbia fatto matching con il contenuto delle parentesi “abab” “abababab” “abababababab” r’(a+)(b+)\1\2’ r’p(.)o p\1o’ r’p.o p.o’ la variabile “\1” corrisponde a qualsiasi stringa abbia fatto matching con il contenuto della prima coppia di parentesi; la variabile “\2” idem, ma rispetto alla seconda coppia di parentesi “abab” “abbabb” “aabaab” “abbaab” la variabile “\1” corrisponde a qualunque stringa abbia fatto matching con il contenuto delle parentesi “pio pio” “pao pao” “pro pro”, ecc. la wildcard “.” può essere sostituita da qualsiasi carattere “pio pio” “pio pao” “pro pso”, “pao pio”, ecc. “pio pao” “pao peo” Raggruppamento e memoria: Esercizi “Il passato prossimo del verbo mangiare”: Invece di: r‘\sho\smangiato|\shai\smangiato|\sha\smangiato|\sabbi amo\smangiato|\savete\smangiato|\shanno\smangiato|\ sHo\smangiato|\sHai\smangiato|\sHa\smangiato|\sAbbi amo\smangiato|\sAvete\smangiato|\sHanno\smangiato‘ possiamo scrivere: r‘\s(?:ho|hai|ha|abbiamo|avete|hanno|Ho|Hai|Ha| Abbiamo|Avete|Hanno)\smangiato‘ oppure r‘\s(?:[hH](?:o|ai|a|anno)|[Aa](?:bbiamo| vete))\smangiato‘ Raggruppamento e memoria: Esempio di sostituzione in Python Sostituire il segno ‘-’ con il segno ‘/’all’interno delle date espresse utilizzando soli numeri: Input: 17/10/2013, 17-10-2013, 30-05-77, 40-12-2013 Output: 17/10/2013, 17/10/2013, 30/05/1977, 40-12-2013 Caratteri speciali Alcuni caratteri hanno un significato speciale nel linguaggio delle RE []?*. ()+-/{} Se questi caratteri fanno parte del pattern di testo da cercare, devono comparire in una RE con davanti il carattere ‘\’ (carattere di escape) r’[a’ r‘\[a’ r‘a.’ r‘a\.’ r‘cane?’ r‘cane\?’ ERRORE! ‘[‘ è interpretato come classe di carattere e manca la parentesi ‘]’ la stringa “[a” qualsiasi stringa di due caratteri che inizia con ‘a’ “ab” “au” “a1” “a?” … la stringa di testo “a.” le stringhe “cane” e “can” la stringa “cane?” Ancore Le ancore sono caratteri speciali che specificano dove deve comparire il pattern di testo da cercare ‘^<pattern>’ il <pattern> deve comparire all’inizio di una linea ‘<pattern>$’ il <pattern> deve comparire alla fine di una linea RE Definizione Esempi di “matching” r‘cane$’ la stringa ‘cane’ quando compare alla fine di una linea “…cane¶” r’^La’ r’^La Spezia$’ “il cane di Mario” la stringa ‘La’ quando compare all’inizio di una linea “¶La macchina era guasta” una riga che contiene solo la stringa “La Spezia” “¶La Spezia¶” “il treno per La Spezia” “…a La Spezia per lavoro …” Ancore “\b” è un ancora che indica il confine di una parola (“\B” indica ogni punto non confine di parola) Il confine di una parola è un punto che ha da una parte un carattere di classe \w e dall’altra o un carattere di classe \W o l’inizio (fine) riga ¶ La macchina in giardino RE Definizione Esempi di “matching” r‘\bcane\b’ la stringa ‘cane’ deve avere a destra e a sinistra un confine di parola “il cane è …” r‘\Bcane\b’ la stringa ‘cane’ deve avere a destra (ma non a sinistra) un confine di parola “il canestro” “le americane sono” “il cane è …” “il canestro” “le americane sono” Precedenza I moltiplicatori, le parentesi, l’alternativa, le ancore sono operatori permettono di costruire RE complesse a partire da altre RE Esistono delle regole di precedenza tra gli operatori r‘a|b+’ Parentesi Moltiplicatori Sequenze e ancore Alternativa () ? * + {m,n}, ecc. ata ^ $ \b | Le parentesi ( ) permettono di alterare l’ordine di precedenza r’a|b+’ vs. r‘(?:a|b)+’ Esercizi Formalizzare con le espressioni regolari i patterns per trovare le seguenti stringhe (NB: parola = sequenza di caratteri separati da spazi o ritorni a capo) "Tutti i numeri con o senza punto o virgola (es. 10.000; 0,56; 45; ecc.)“ “Le parole in fondo ad una linea di testo che terminano per sto o per sito“ “I punti di fine frase che compaiono in fondo ad una linea di testo“ “Gli acronimi di almeno 2 lettere maiuscole con le lettere separate da punti (es. U.S.A.)“ “I numeri formati da una cifra pari e una dispari alternata (es. 21, 234, 4896, ecc.)“ “Le linee di testo che terminano con una lettera maiuscola“ “L'imperfetto indicativo di amare, sia con la lettera minuscola che con la maiuscola“ (presentare la soluzione più sintetica) Usando l’operatore di sostituzione: nelle date con il mese scritto a lettere, sostituire gli spazi con l'underscore (es. 25 marzo 2003 diventa 25_marzo_2003) separare con uno spazio le parentesi e le virgolette dalla parola (es mare, e (casa) diventano mare , e ( casa ) ) trasformate i numeri invertendo la prima cifra con l’ultima (es: 123456 diventa 623451) trasformate tutte le parole del testo che iniziano per vocale invertendo il primo carattere con l'ultimo (es alto diventa olta)
© Copyright 2024 ExpyDoc