Bonjour,
Je souhaiterais une explication sur la notion de retour arrière dans les expressions régulières perl.
Voici un exemple :
Soit une chaine du type suivant : CATCCTCCTTAAGC
Je cherche à calculer le nombre de motifs suivant :
- CAA
- CAT
- CAC
- CTA
- CTT
- CTC
- CCA
- CCT
- CCC
Je recherche ces 9 motifs.
Si je fais 9 expressions régulières + la somme de chaque résultat, j'ai le bon résultat. Si je cherche à faire une seule expression régulière, j'obtiens un résultat différent à cause du chevauchement des motifs et du non retour en arrière de l'expression régulière en cas de succès de matching. Comment faire une expression régulière récursive, optimale sans qu'elle ne tourne à l'infinie.
Voici mon programme et résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #!/usr/bin/perl use strict; use Carp; use warnings; my $sequence = 'CATCCTCCTTAAGC'; my $somme = 0; my @motifs = qw/CAA CAT CAC CTA CTT CTC CCA CCT CCC/; foreach my $motif ( @motifs ) { my @match = $sequence =~ m{$motif}g; my $nbr = scalar @match; $somme += $nbr; print "Motif : $motif ($nbr)\n"; print "Match : @match\n"; } print "Somme : $somme\n\n"; my @match2 = $sequence =~ m{C[ATC][ATC]}g; my $somme2 = scalar @match2; print "Regex : m{C[ATC][ATC]}g\n"; print "Match2 : @match2\n"; print "Somme2 : $somme2\n\n"; my $regex_join = join('|', @motifs); my @match3 = $sequence =~ m{$regex_join}g; my $somme3 = scalar @match3; print "Regex : $regex_join\n"; print "Match3 : @match3\n"; print "Somme3 : $somme3\n\n"; __END__On remarque que la somme n'est pas de 5 mais 3.Motif : CAA (0)
Match :
Motif : CAT (1)
Match : CAT
Motif : CAC (0)
Match :
Motif : CTA (0)
Match :
Motif : CTT (1)
Match : CTT
Motif : CTC (1)
Match : CTC
Motif : CCA (0)
Match :
Motif : CCT (2)
Match : CCT CCT
Motif : CCC (0)
Match :
Somme : 5
Regex : m{C[ATC][ATC]}g
Match2 : CAT CCT CCT
Somme2 : 3
Regex : CAA|CAT|CAC|CTA|CTT|CTC|CCA|CCT|CCC
Match3 : CAT CCT CCT
Somme3 : 3
Merci
Partager