[R] Pattern, toujours et encore ...

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

[R] Pattern, toujours et encore ...

#1

Message par PandiPanda »

Bonsoir,

Je sais que de nombreux adepte du "Regex" se trouve dans cette jolie communauté, pour cette raison que je demande une petite (voir une très grande ...) pour faire ceci;

Je vout met une phrase d'exemple ainsi que le resultat voulu !
► Afficher le textema phrase d'exemple
Je voudrai que le regex me modifie ce String en
► Afficher le textemon resultat voulu
Donc je veux que le texte sélectionner soit en dehor des "<span>"
ici<span=xxx>MonTexte</span>ici
Il faudra donc (je l'éspère ...) utiliser ceci; StringRegExpReplace()
Modifié en dernier par PandiPanda le mer. 04 janv. 2012 21:50, modifié 1 fois.
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..] Pattern, toujours et encore ...

#2

Message par lesolutionneur »

Je pense que un petit déplacement avec $1, $2... ferait l'affaire ;)

Sans être indiscret, à quoi cela te servira-t-il ?
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [..] Pattern, toujours et encore ...

#3

Message par Iste »

J'ai pas trouvé de solution propre, je serais intéressé de voir une "vrai" solution !
Mais en attendant, essayez ceci...

Code : Tout sélectionner

#Include <Array.au3>

$_String='je <span class="kikouMaClasse"> "suis" la lol </span> tu <span class="KikouMa2ndClasse">il</span>nous'

$_String = "span>" & $_String & "<span"

$result = StringRegExpReplace($_String, '(span>)(.*?)(<span)', '$1<span class="C2">$2</span>$3')

$result = StringTrimLeft($result, 5)
$result = StringTrimRight($result, 5)

MsgBox('','',$result)
Signez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Pattern, toujours et encore ...

#4

Message par jchd »

Je n'ai pas de solution propre en un coup, à cause du caractère probablement optionnel du texte qu'il s'agit de mettre en classe C2.
Je n'ai pas trop cherché non plus, je dois dire !
On doit pouvoir le faire avec plusieurs patterns conditionnels et macros, mais ça devient vite lourd.

Le plus simple que j'ai, c'est ça :

Code : Tout sélectionner

Local $_String = 'je <span class="kikouMaClasse"> "suis" la lol </span> tu <span class="KikouMa2ndClasse">il</span>nous'

;'<span class="C2">je</span> <span class="kikouMaClasse"> "suis" la lol </span>'& _
;' <span class="C2">tu</span> <span class="KikouMa2ndClasse">il</span><span class="C2">nous</span>'

Local $res = StringRegExpReplace($_String, "(?i)\s*+([^<]*?)(?=\s*+$|\s*+<span)(<span.*?</span>)?", '<span class="C2">$1</span>$2')
$res = StringReplace($res, '<span class="C2"></span>', '')
ConsoleWrite($res & @LF)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [..] Pattern, toujours et encore ...

#5

Message par PandiPanda »

@lesolutionneur
Oui je me doutais bien qu'un "simple" déplacement aurai suffit ! Disons que je bloquai niveau Pattern pour "sélectionner" le texte voulu.

Non ce n'est pas indiscret, c'est simplement pour modifié un contenu html, je ne veux modifié que le texte en dehor des "<span>". Comme le dit jchd, la classe C2 est bel et bien optionnel, je le modifierai en fonction de mon CSS.

@Iste
Votre code est pas mal, simplement un petit bug avec ce teste ci;
► Afficher le texte
► Afficher le textele resultat
@jchd
Merci pour ce bout de code, actuellement les tests que je fait passe bien ^^
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
Iste
Niveau 11
Niveau 11
Messages : 1870
Enregistré le : jeu. 04 déc. 2008 14:21
Localisation : 76
Status : Hors ligne

Re: [R] Pattern, toujours et encore ...

#6

Message par Iste »

Oui pas étonnant, j’étais même surpris que ca ai fonctionné !

Par contre la solution de jchd semble correcte, mais a ce sujet, dans

Code : Tout sélectionner

(?=\s*+$|\s*+<span)
que signifie le "?=" du début ?
Et comment diable sont organiser les back-references ?? par odre d'ouverture de parenthèses ? ou c'est plus compliqué ?

Beaucoup de mal a trouver de la doc la dessus, sur notre ami commun, je ne trouve que de la doc pour débutant ou très spécifique... Cet ami n'aide pas non plus par le fait qu'il ignore la syntaxe de mes requêtes pour la transformer en texte...
Signez ici
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [R] Pattern, toujours et encore ...

#7

Message par sylvanie »

Bonjour à tous et bonne année.
Bon et bien bravo à Jchd, je m'étais lancé dans une usine à gaz en voulant passer par 3 patterns (début, milieu et fin de chaîne), mais voilà ce à quoi j'aboutis (attention ça pique les yeux):
► Afficher le texte
bref très lourd

+1 pour la question relative à ?= , j'ai comme l'impression qu'il s'agit de la sélection en mode "plus petite chaîne qui match" et non la plus grande (comportement par défaut)
Pour les back-ref, pour moi il s'agit bien de l'ordre d’apparition des parenthèses de sélection avec comme exception $0 qui correspond au match total
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Pattern, toujours et encore ...

#8

Message par jchd »

Me revoilà, vêtu de la tenue appropriée pour une autopsie de mon propre cadavre et dont voici les viscères :

Code : Tout sélectionner

Local $res = StringRegExpReplace($_String, "(?i)\s*+([^<]*?)(?=\s*+$|\s*+<span)(<span.*?</span>)?", '<span class="C2">$1</span>$2')
$res = StringReplace($res, '<span class="C2"></span>', '')
Pour le pattern du Replace :

(?i) = option "insensible à la casse"
\s*+ = avale d'éventuels blancs en tête (ou répétition) sans les relâcher (le + après * est le "possessive quantifier" de Friedl = pas de backtracking sur cette répétition *, c'est un cliquet vers l'avant)
( = début de capture (ce sera $1)
[^<]*? = toute suite de caractères qui ne soit pas <, limitée par le quantifier ? à la plus petite chaîne (aussi appelé non-greedy)
) = fin de capture
On a donc capturé en $1 un mot "entre les <span...> texte </span>. Comme cette chaîne peut être vide, le remplacement qu'on va faire (voir plus bas) créera une instance de C2 sans texte. A priori on pourrait peut-$etre laisser ainsi, mais selon la sémantique de la classe C2 cela pourrait avoir une incidence parasite. C'est la raison pour laquelle il vaut mieux faire un StringReplace ensuite pour éjecter d'éventuelles instances de C2 vides. Cette digression faite, on continue car le morceau précédant est qualifié par ce qui suit.
(?= = le pattern précédent doit être suivi de (c'est un "lookahead")
\s*+$ = d'éventuels blancs avalés (avec cliquet) suivi de la fin de la chaîne sujet
| = ou bien
\s*+<span = d'éventuels blancs avalés (avec cliquet) suivi de <span
) = fin de condition vers l'avant (lookahead)
C'est cette condition-là qui préserve les <span...> texte </span> préexistants dans le sujet
On n'en n'a pas encore fini, car il faut bien les retrouver dans le résultat ces <span... "natifs", donc :
( = début de capture (ce sera $2)
<span.*?</span> = ce pattern correspond à un span "natif". Ici le qualifier ? est encore notre copain "non-greedy"
)? = fin de capture, rendue optionnelle par ? (attention, ce n'est pas le même ? que celui qui précède, c'est ici l'équivalent de {0,1}

La partie remplacement devrait maintenant être claire.

Pour les gens que les regexp chatouillent, le document le plus complet est la version html de la doc contenue dans l'archive des sources de PCRE, accessible ici en https. Prenez la dernière version (8.21 à ce jour), pas la peine de finasser et de chercher quelle version exacte AutoIt utilise car les différences dépassent de beaucoup les besoins d'utilisateurs lambda comme nous, d'autant plus que la plupart des releases intermédiaires sont des fixes.

Pour info, une interface PCRE 16-bit est en cours de finalisation. Pour l'instant, PCRE ne traite que de l'UTF-8 MAIS ATTENTION, le support Unicode (UCP) n'est pas présent dans la compilation d'AutoIt. Il n'est donc pas possible aujourd'hui d'employer les méta-caractères de propriétés Unicode sous AutoIt.
Corollaire : \w ne matche pas é ni ç ni aucun caractère > 0x80.

Si des détails vous tracassent, vous empêchent de dormir ou plus simplement vous interpellent, dites-le !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [R] Pattern, toujours et encore ...

#9

Message par PandiPanda »

Merci bien pour ces explications assez détaillées !

J'aurai une petite demande aussi ^^

Avec la fonction StringRegExpReplace() est il possible de récuperer quel partie de pattern il à "match" (et la première qu'il a pu trouvé), je vais vous expliqué ce que je veux dire avec un exemple !
► Afficher le texte
Dois je obligatoirement passer par un StringRegExp() et recuperer la premiere valeur de l'array?
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Pattern, toujours et encore ...

#10

Message par jchd »

Bah voui, avec $Count = 1

Comme dirait Clooney : "What else?"

Un indice :
► Afficher le texte
D'ailleurs, je viens de dire une ânerie XXL car ça marche aussi avec $count = Default (0), évidemment !
Mais comme toujours, c'est _après_ avoir posté qu'on se rend compte à quel point on déblatère. C'est l'âge sans aucun doute, du moins j'espère car je ne peux plus demander à ma mère qu'elle me refasse mieux câblé.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

Re: [R] Pattern, toujours et encore ...

#11

Message par PandiPanda »

Oulalala, merci encore.

Et en effet,
cela fonctionne avec count= 0. Car le 1er match (de notre recherche group du pattern) correspond au '$1'

M'enfin, je vais laisser reposer un peu ma tête, je commence a voir du pattern partout. Sans oublier que j'ai plus l'impression de faire du "hasard" qu'autre chose ...

Surtout que la je commence peu à peu a saturé après avoir ouvert + de 200 msgbox() pour vérifié mon pattern. Qui ne fonctionne toujours pas d'ailleurs :x Et pour couronner le tout, j'ai un mélange de fascination et de jalousie envers votre facilité à sortir des notions qui m'ont l'air tellement abstraite et hors de portée ...
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Pattern, toujours et encore ...

#12

Message par jchd »

C'est comme avec les animaux non familiers : c'est surtout les yeux qui font peur. En effet, si tout le monde s'accorde à reconnaître que la syntaxe est rébarbative, elle ne fait que recouvrir des notions tout-à-fait quotidiennes que nous utilisons sans même y penser. L'empilement ou la juxtaposition d'éléments procède de même. C'est seulement une gymnastique à laquelle il faut peu à peu s'habituer, du simple au plus complexe.

Ainsi quand on regarde ta chaîne sujet, on "voit" ce que tu veux faire et on identifie mentalement les parties de texte hors span, tout comme on identifie des visages connus dans une photo de groupe. Ces méta-caractères et constructions qui semblent si subtils ne sont que raccourcis pour décrire une toute petite partie du cheminement intellectuel qui nous permet de faire ça à la volée.

Un moteur RegImg qui ferait de la reconnaissance de formes et/ou de visages dans une image aurait besoin d'une foultitude de "méta-images" bien plus intimidantes qui, moi, me fouttrait les jetons !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre