PATTERN MATCHING
Imparato cosa sono e come si usano le espressioni regolari per individuare dei
pattern, vediamo come si usano in Perl per cercare i pattern in una stringa
$stringa=~ /espressione regolare/
L’espressione nel suo complesso è vera se il pattern descritto dall’espressione
regolare è trovato nella stringa. In tal caso la stringa ($stringa) appartiene a
quell’insieme verde che avevamo visto nel primo lucido. Se invece $stringa
non contiene il pattern allora si troverà nell’insieme di stringhe rosso.
Esiste anche una versione con !~ al posto di =~ che funziona
al contrario: è vera se la stringa non contiene il pattern
$a=~ /Mari[ao]/ è vera se la stringa $a contiene il pattern Maria o Mario
if ($a=~/^\d+$/){
vera se $a è un numero naturale
print “$a è un numero\n”;
}
BIOINFO3 - Lezione 29
1
ESEMPIO
BIOINFO3 - Lezione 29
2
ESEMPIO
operatore “x”: ripete un numero prefissato di
volte la stringa che lo precede
Il pattern può essere una variabile!!!!
BIOINFO3 - Lezione 29
3
BIOINFO3 - Lezione 29
4
ESERCIZIO
Leggere un file (ad esempio in redirezione) . Stampare solo le righe che
iniziano con il carattere >
BIOINFO3 - Lezione 29
5
ESTRAZIONE DEI PATTERN
Se si è interessati a ricavare il valore effettivo delle sottostringhe
che hanno soddisfatto certi pattern (ad esempio anche solo una
parte di una espressione regolare) si possono racchiudere questi
pattern tra parentesi tonde. Le sottostringhe vengono poi
automaticamente assegnate rispettivamente alle variabili $1, $2,
… (il primo pattern tra parentesi alla variabile $1, il secondo alla
variabile $2,…)
/
(
)
$1
BIOINFO3 - Lezione 29
(
)
$2
/
…..
6
ESEMPIO
Nella seguente istruzione ho colorato i tre sottopattern con
colori diversi per individuarli subito a vista d’occhio. In
particolare se la stringa $data ha il formato previsto ed è
quindi una data valida (una o due cifre per il giorno, una o
due cifre per il mese, due, tre o quattro cifre per l’anno,
separate dal carattere -) allora si esegue l’if, in cui la
sottostringa corrispondente al primo pattern viene salvata in
$1, la sottostringa corrispondente al secondo pattern viene
salvata in $2 e la sottostringa corrispondente al terzo
pattern viene salvata in $3
if ($data=~ /([0-9]?[0-9])-([0-9]?[0-9])-([0-9]?[0-9]?[0-9][0-9])/){
$giorno=$1;
$mese=$2;
$anno=$3;
}
BIOINFO3 - Lezione 29
7
ESERCIZIO
Leggere delle righe dall’input. Se la riga inizia con la stringa PESO: seguita da
un numero qualsiasi di spazi e tab e da un numero, catturare tale numero.
Altrimenti stampare un messaggio di errore. Se il numero è maggiore o uguale
a 100 stampare “A DIETA!\n” altrimenti stampare “PESO OK!\n”.
BIOINFO3 - Lezione 29
8
SOSTITUZIONI
In una stringa è possibile sostituire automaticamente una sottostringa che
verifichi un determinato pattern con un’altra stringa
$stringa=~ s/pattern di ricerca/sostituzione/gi
Le opzioni g ed i sono facoltative e valgono anche per il pattern matching:
g
sostituisce tutte (global) le occorrenze del pattern incontrate. Se non si
specifica g, viene sostituita solo la prima occorrenza.
i
sostituisce in modo case insensitive, cioè non preoccupandosi se la
stringa trovata ha esattamente le maiuscole e le minuscole specificate
$a=“AUTOCARRO 150”;
$a=~ s/AUTO/MOTO/; # $a diventa “MOTOCARRO 150”
$a=~ s/RR/R/g;
# $a diventa “MOTOCARO 150”
$a=~ s/ //g;
# $a diventa “MOTOCARO150”
$a=~ s/[0-9]+//g;
# $a diventa “MOTOCARO ”
BIOINFO3 - Lezione 29
9
ESERCIZI
Rimuovere dalla stringa $b tutte le occorrenze dei caratteri di spaziatura
Sb=~ s/\s//g; (N.B. senza il g rimuove solo il primo!!)
Trasformare tutti gli spazi multipli della stringa $nome in spazi singoli
Snome=~ s/ +/ /g; (N.B. ancora è necessario il g)
Rimuovere dalla stringa $cognome gli spazi iniziali
Scognome=~ s/^ +//;
Mascherare nella sequenza di DNA $s la sottosequenza ACTGTT con
XXXXXX
Ss=~ s/ACTGTT/XXXXXX/gi;
essere anche minuscola!)
BIOINFO3 - Lezione 29
(N.B.
la
sequenza
potrebbe
10
ESERCIZIO
Leggere delle righe dall’input. Le righe rappresentano sequenze di DNA. Se la
riga contengono il > stampare la riga cosi com’è. Altrimenti stampare la riga
dopo aver rimosso tutti i caratteri diversi dalle quattro basi
BIOINFO3 - Lezione 29
11
RIEPILOGO
•Pattern matching
•Estrazione di pattern
•Sostituzione di pattern
Esercizio 15. Passare come argomenti ad un programma due nomi di
file. Il primo contiene delle stringhe (una per riga), il secondo delle
espressioni regolari (uno per riga). Stampare una per riga le
stringhe e per ciascuna stampare, sulla stessa riga, separati da spazi,
tutte e sole le espressioni regolari verificate da quella stringa.
BIOINFO3 - Lezione 29
12
Scarica

è vera se la stringa non contiene il pattern $a