Newsgroup: it.comp.lang.perl
Titolo: regular expression filtri

Ciao.
Ho scaricato mailwasher e ho tentato di mettere 
i filtri.
In particolare mi serve il filtraggio di parole esatte.
Per esempio voglio filtrare tutte le email che contengono la parola
and,
ma devo evitare che vengano filtrate anche quelle 
che contengono la parola andare.
So che si tratta di regular exprssion,
ma sono ignorante nel campo.
Qualcuno sa dirmi come fare?
Grazie.
Emilio

 Qualcuno sa dirmi come fare?
/\s[Aa]nd[\s\,\.\;]/
(anche se '\.', '\,' e '\;' li ho messi per scrupolo).
Ciao,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)           [ 
http://www.radiance.d2g.com/~zefram
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

 wrote in message
news:3egbpu85aa2e2gotv...@4ax.com...

Se ti serve un pezzo di codice per decidere cosa fare in caso un certo contenuto
contenga una certa parola... ti ho scritto una piccola sub che fa al caso tuo:
my $parole_da_filtrare = [qw(and)];
filtro('bla bla bla and, bla bla', $parole_da_filtrare ) ? print 'OK' : print
'NO';
filtro('bla bla bla andare, bla bla', $parole_da_filtrare ) ? print 'OK' : print
'NO';
# richiede un contenuto stringa come primo parametro
# e una referenza ad un array di parole che
# attivano il filtro come secondo parametro
sub filtro
{
    my ($content, $words) = @_;
    my $regex = join '|', @$words;
    $regex = qr/\b$regex\b/;
    $content =~ $regex;
}
ciao
dd
ciao
dd

 wrote in message
news:an5cs3$b50nf$1...@ID-159100.news.dfncis.de...

hmmm... ripensandoci...
Questo è più semplice e più efficiente (e ha le parentesi che servono per usare
più di una parola simultaneamente come filtro ;-) ):
# codice
my $filtro = join '|', qw(and pippo);
$filtro = qr/\b($filtro)\b/;
# prove
'bla bla bla and, bla bla' =~ $filtro ?  print 'OK' : print 'NO';
'bla bla bla pippo, bla bla' =~ $filtro  ?  print 'OK' : print 'NO';
'bla bla bla andare, bla bla' =~ $filtro  ?  print 'OK' : print 'NO';
Usa $filtro come Regular Espression Compilata dove vuoi nel tuo code.
ciao
dd

 (anche se '\.', '\,' e '\;' li ho messi per scrupolo).
hmmm e... and! and? ,and .and .... ecc. ecc???
/\band\b/i
perldoc perlre
" \b  Match a word boundary "
;-)
ciao
dd

 hmmm e... and! and? ,and .and .... ecc. ecc???
Ho usato una RE che va bene per un testo scritto in maniera *corretta* e
con un minimo di senso (finiresti una frase con " e."?)... ;-)


 con un minimo di senso (finiresti una frase con " e."?)... ;-)
già... ma quale sarebbe la RE per sapere se il testo è "corretto ed ha un minimo
di senso"? :-))))
La richiesta cerca una RE per "filtraggio di parole esatte" NON il filtraggio
della parola 'and' nel contesto della lingua inglese corretamente scritta. :-)
Contrariamente al concetto che applichi tu, la filosofia di una RE è proprio:
individuare SOLO il criterio che fa la differenza, e nel caso richiesto il
criterio è "CHE SIA UNA PAROLA", indipendentemente da quello che la circonda, e
per dire a perl di trovarti una parola basta che usi \bparola\b.
Considera che se per ogni parola che vuoi filtrare dovessi pensare a DOVE
specificamente può essere scritta in un testo "corretto e con senso" allora non
finiresti più, perché dovresti scrivere una RE specifica per ogni singola
parola, includendo anche il contesto in cui decidi che può o non può trovarsi.
E comunque non basterebbe ancora: PRIMA dovresti essere sicuro che il testo sia
corretto e così dovresti PRIMA scrivere (o trovare) un parser per verificare la
grammatica.
Mi sembra più comodo usare \b. Ti ha fatto qualcosa che non lo vuoi usare? :-)
ciao
dd

 per dire a perl di trovarti una parola basta che usi \bparola\b.
Se il contesto non è individuato, o si sta parlando di casi
perfettamente generici, allora hai ragione.
Se il contesto viene individuato, allora ecco che la RE è quel
*determinato criterio* che fa la differenza *in quella determinata*
situazione.


 situazione.
Ma cosa vuol dire "se il contesto viene individuato"??? Più complichi la RE per
individuare una parola, e più sarà limitata la sua azione, e più saranno i
contesti in cui fallirà.
Vabbé... sono sicuro che continuerai ad arrampicarti sui vetri tentando di
spiegare che TU hai ragione... così invece di perdere altro tempo a spiegarti la
storia della rava e della fava, che tanto non vuoi nemmeno ascoltare, fammi un
esempio pratico in cui la RE:
m/\bparola\b/i
fallirebbe nell'individuare la presenza di una 'parola' esatta in un testo,
mentre quella che hai scritto tu INVECE non fallirebbe.
Non fare più bla bla bla e fammi un esempio o taci per sempre, ok? :-)
ciao
dd