Expression regulière

Fermé
Stef - 28 avril 2006 à 16:01
 Stef - 2 mai 2006 à 09:55
Bonjour,
Je n'arrive pas a construire une xepression regulire qui me rend pour un style donné et un type donné sa valeur.
Exemple pour la feuille suivante j'aimerais obtenir #A3C1E0
pour le style .stylebleu et le type background-color avec une expression reguliere.

Merci de vos réponses

.stylebleu {
background-color: #A3C1E0;
}

.styleMenu {
color: #FFFFFF;
background-color: #3A76B1;
background-position: center center;
text-align: center;
vertical-align: middle;
text-transform: none;
}

11 réponses

sebsauvage Messages postés 32847 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 656
28 avril 2006 à 16:19
En Python, et hop...

css = """
.stylebleu {
background-color: #A3C1E0;
}

.styleMenu {
color: #FFFFFF;
background-color: #3A76B1;
background-position: center center;
text-align: center;
vertical-align: middle;
text-transform: none;
}
"""
import re
regexp = re.compile("\.stylebleu\s*?{.*?background-color:(.+?);.*?}",re.DOTALL|re.IGNORECASE)
print regexp.search(css).group(1)
1
sebsauvage Messages postés 32847 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 656
28 avril 2006 à 16:26
Petite correction:
"\.stylebleu.*?{.*?background-color:(.+?);.*?}"
1
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 avril 2006 à 17:07
Salut,

et son cousin en Perl
sebsauvage a utilisé une variable; moi j'ai écrit le contenu dans un fichier .css que je l'écrit en argument .

Execution : script fichier.css
#! /usr/bin/perl

use warnings;
local $/; # mode slurp (le fichier est avalé dans une variable scalaire)

$t=<>; # on utilise le fichier .css en tant qu'argument

print $1,"\n" if $t=~/.stylebleu\s*{.*?background-color:\s*(.*?);.*?}/si;

modificateur i pour insensibilté à la casse
modificateur s pour mode une seule ligne (le . reconnaît aussi le \n )

lami20j
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 524
28 avril 2006 à 18:56
Sous php, pour utiliser ces expressions régulières tu ne peux pas prendre ereg, il faut prendre preg_match ou preg_match_all

? signifie une fois ou pas.

donc .*? signifie
"tout caractère, autant de fois qu'on veux mais une seule fois".

Bizzare hein? Et bien c'est logique en fait, si tu appliques:

.*m

pour la chaine " / - g f m p" il ne s'arrêtera pas à m mais il ira jusqu'au bout, puisqu'on lui a dit tout caractère autant de fois qu'on veut juste avant.

Si tu mets:

.*?m

pour la même chaine, il prendra " / - g f m" car il arrêtera son expression .* dés qu'il trouvera un m.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
28 avril 2006 à 19:02
Salut,

? c'est un quantificateur qui veut dire facultativ

ab?c reconnaît ac mais aussi abc

Dans la construction .*? a une autre signification. Il s'agit des quantificateur * paresseux.

Exemple

"popup =~ /p(.*)p/ # on capture opu
et

"popup =~ /p(.*?)p/ # on capture o

Je ne connaît pas php. Pour m'amuser j'ai fait un script qui fait une recherche progressive dans menu.css et trouve toutes les correspondances.
Je ne sais pas si en php ou python il y a l'assertion \G
#! /usr/bin/perl

use warnings;
my %h;
local $/; # mode slurp

$t=<>; # on utilise le fichier .css en tant qu'argument

while ($t =~ /.style(\w+?)\s*{.*?background-color:\s*/sig){
  my $c = $1;
  $t =~ /\G(#\w+)/ and $h{$c} = $1;
}

foreach (sort keys %h) {
 print "style$_ : $h{$_}\n";
}
Le fichier menu.css
[lamitest@localhost my_perl_script]$ cat menu.css
.stylebleu {
background-color: #A3C1E0;
}

.styleMenu {
color: #FFFFFF;
background-color: #3A76B1;
background-position: center center;
text-align: center;
vertical-align: middle;
text-transform: none;
}
.stylePerso {
background-color: #AFC1B0;
}

.styleNewMenu {
color: #FFFFFF;
background-color: #AA76BA;
background-position: center center;
text-align: center;
vertical-align: middle;
text-transform: none;
}
[lamitest@localhost my_perl_script]$
Le résultat
[lamitest@localhost my_perl_script]$ perl regex_stef_ccmG.pl menu.css
styleMenu : #3A76B1
styleNewMenu : #AA76BA
stylePerso : #AFC1B0
stylebleu : #A3C1E0
[lamitest@localhost my_perl_script]$
lami20j
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 524
28 avril 2006 à 19:09
Arg, finalement je me reprsentait pas si bien que ça le .*?

Sympa ce petit cours, le perl reste toujours aussi incompréhensible pour moi d'ailleurs.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
28 avril 2006 à 19:22
Salut kilian,

comme j'étais en train de t'adresser un petit message pendant que tu as déjà écrit un....


En Perl .*? veut dire de prendre n'importe quel caractère mais de se contenter avec le minimal qui le satisfait

Voilà 3 cas :
"exigence" =~ /e(.*)e/ ; capture de xigenc

"exigence" =~ /e(.*?)e/; capture de xig

"exigence" =~ /.*e(.*?)e/; capture de nc
Pour ton cas *.m, c'est vrai que la regex avale tout mais ensuite elle est obligé de s'incliner quant'à la reconnaissance de m donc elle va céder un caractère pour que l'expression réussie en totalité.

Bien sûr ça depende aussi du moteur utilisé par le regex.

a+,
lami20j
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 524 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
28 avril 2006 à 19:27
Ok, j'avais bien saisi le truc dans ton explication d'avant.
Mais c'est surtout la syntaxe du perl, pour moi c'est du Kanji :-)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
28 avril 2006 à 19:31
Ben, le jour ou tu voudras apprendre kanji et je pourrai t'aider, je le ferai avec plaisir.

lami20j
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 524 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
28 avril 2006 à 19:37
Merci :-)
0
Ok merci
Je vais essayer .
0
merci encore de vos réponse.
Mais que signifie le ? car sous php cela ne passe pas ?
0
"pour la chaine " / - g f m p" il ne s'arrêtera pas à m "
C'est donc pour cela qui'il me prenait la derniere occurence de background-color: avec mon expression reguliere !
Merci encore, je vais essayer avec preg_match .
0
J'aimerais remplacer le resultat par la valeur #FFFFFF comment faire en PHP ?
0
Désolé pour le message précédent je me suis emmélé le clavier.
J'ai essayer avec preg_replace mais je n'y arrive pas.
Si quelqu'un pouvait m'aider ???
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
29 avril 2006 à 21:26
Re,

regarde ici http://www.expreg.com/eregreplace.php

lami20j
0
J'ai esayer avec echo preg_replace('\.stylebleu.*?{.*?background-color:(.+?);.*?}' ,"\\1",$chaine,1); mais j'ia cette erreur :
Warning: Delimiter must not be alphanumeric or backslash
Est-ce que quelqu'un a une idée ?
Merci de vos réponses
0