Aller au contenu

Un peu de Regex (ou expression régulière)


tbr

Messages recommandés

Salut la foule !

Bon, autant vous dire que ce n'est pas du tout moi qui vais vous faire un topo sur les expressions régulières (ou regex, voire regexp)... Nan, nan ! :)

C'est plutôt moi qui aurais bien besoin d'aide pour un truc tellement simple à dire, pas aussi facile à faire, du moins pour moi.

L'objectif est maintenant presque atteint mais je dois impérativement simplifier l'année en ne gardant que les 2 chiffres de droite... mais je n'y arrive pas. Quand ce sera fait, ça passera dans une moulinette OCR. Pif Paf ! Terminé. :)

...

Point de départ :

N° O.S. 80370-2013-6742 Décompte 001 Type TD

Objectif à atteindre :

80370136742001TD

--> je ne garde que les caractères en gras, tout le reste dégage;

--> n'importe quel groupe de chiffre au format 00000-0000-0000 puis 000 et enfin deux lettres capitales sont ok.

Avec l'expression régulière que j'ai construite donc, autant au pif, qu'en logique et/ou tâtonnements divers et fastidieux (mais promis juré, sans pomper sur un exemple), j'obtiens ceci

8037020136742001TD, le 20 de 2013 doit aussi dégager !... et bor**l, je sèche.

Voici le(la ?) regex que j'ai bidouillée, si l'un de vous a la réponse/solution, je l'en remercie par avance.

(?:\d{1,})[^\s\D]|[A-Z]{2}

Bonne journée/soirée ou nuit.

PS : le pire (ou le plus drôle) est que, si ça se trouve, l'expression régulière que j'ai créée et testée (et que je vous soumets)... ne fonctionnera pas selon que vous le ferez avec tel ou tel système (PERL, Java, JS, Ruby, Python, PHP, etc.)

M'enfin, en principe, ça sera inclus dans une usine à gaz Microsoftienne, logiciel EMC2 oblige.

Lien à poster

J'ai aussi testé, ça a l'air de fonctionner. En tout cas, ce qui déterminera l'ultime regex, c'est le logiciel utilisé au boulot... et ce "truc" fait pas toujours comme je l'espère.

Sinon, pour reprendre ta proposition, je l'ai simplifiée/modifiée encore :

\d{5}|\d{2}(?=\D)|\d{4}(?=\s)?<=\D)\d{3}(?=\D)|[A-Z]{2}

Je verrai le résultat lundi.

Merci beaucoup. :)

Lien à poster

C'est chouette ça ...

En d'autres termes, le logiciel ne gère pas les regexp.

( Ce qui veut dire aussi que le dev qui a commis ça s'est amusé à recréer son propre moteur de regexp, plutôt que d'utiliser les 41 moteurs tout prêts à sa disposition )

Va falloir fouiller dans la doc dudit logiciel histoire d'avoir une raison de laisser tomber... :p

M'enfin essayes de mettre le tout entre parenthèses histoire de rigoler un peu.

Lien à poster

En terme de doc, si tu savais... :)

Un clic sur le help (de Free Form Designer intégrant cette fonction de regexp bidonnée) se réfère directement à ça : http://msdn.microsoft.com/en-us/library/az24scfc.aspx

(et moi, quand je lis "Microsoft", je sais pas... mais j'ai des foutus soupçons quant à leur respect des normes -- Rien qu'à voir comment ils ont fait ch*** le monde du web. Bref.).

En d'autres termes, au lieu de concaténer les éléments comme je le veux et comme on peut le voir dans mon 1er post (caractères en gras sur une seule ligne), ce débile ne prend QUE le 1er morceau et se fout du reste. Je me retrouve donc avec un test qui prétend tout saisir alors qu'il n'en est rien. C'est comme si j'avais pissé dans un violon. /:

Après, tu m'étonnes que tout ce qui se rapporte à Microsoft me sorte par les trous de nez : bande de cons !

...

J'ai essayé avec les parenthèses aussi avant que tu me le suggères... Que dalle !

Peut-être qu'en le faisant bouillir ?...

Quelle #~@% ce truc ! Codé par une amibe.

Lien à poster

|

Matches any one element separated by the vertical bar (|) character.

th(e|is|at)

"the", "this" in "this is the day. "

En d'autres termes : tu peux envoyer un rapport de bug, le logiciel ne suit pas sa propre documentation.

Lien à poster

Purée, vu la doc, bugger ce truc à ce point demande du talent : normalement tout ce qu'il y a à faire c'est envoyer l'expression au format string à .Net qui s'occupe du reste.

Comment il fait, il envoie l'expression au format UTF non supporté ou quoi ?!

edit : ou alors il gère bien le format du bordel mais il ne prend pas l'intégralité du résultat retourné par .Net...

Wait ...

http://www.regular-expressions.info/dotnet.html

Either way, you will get an object of class Match that holds the details about the first regex match in the subject

(...)

To find the next match of the regular expression in the same subject string, call MatchObj.NextMatch() which returns a new Match object containing the results for the second match attempt. You can continue callingMatchObj.NextMatch() until MatchObj.Success is False.

Donc le dev s'est merdé et considères que le premier résultat de l'expression, sans tester pour d'eventuels resultats ultérieurs. Ce qui du coup rend l'utilisation du | inutile puisque l'expression que l'on a pondu donne plusieurs resultats. La seule solution est donc de prendre les sous expressions et de lancer le log séparément pour chaque. ( Prendre le developpeur par les oreilles et le jeter contre un mur porteur jusqu'à que le problème soit résolu marche aussi. )

Lien à poster

Donc il a codé avec ses pieds (vu que je code mieux que lui, apparemment, et ce sans rien y connaitre) et "demerdeunezizisiche" pour que ça (ne) marche (pas).

Mine de rien, ce regex me ferait gagner un temps dingue : une vingtaine de manip (souris/clavier) x le nombre de lectures annuelles moyen :

... Tadaaaa ! 900 000 manip/an automatisées que ce regex aurait pu exécuter sans broncher.

Lien à poster

J'ai lu quelques trucs mais rien de probant. Certains disent que Applescript s'en rapproche le plus, voire Automator (mais j'ai des doutes).

Je crois que je vais devoir tester ça sur une partition virtuelle avec un Win8Pro "tombée du camion".

> installer un VMWare ou Parallels

> installer Windows

> installer autoit

>> rentrer chez moi car la journée sera finie. :D (j'exagère : un fonctionnaire, ça "bosse")

> tester le tout chez moi

> constater que ça marche

>... et voir qu'à nouveau le soft qui fait portnawak

...n'y pige rien.

Bon, j'avais déjà un Win8 installé sur Fusion et installer AutoIt n'a pris que quelques instants.

-- "euh, c'est quoi c'truc ? J'ai bien peur d'y comprendre encore moins mon latin de cuisine."

De toute façon, si ces logiciels font le boulot, une fois passée dan la moulinette du soft pro que je suis contraint d'employer, comme avec la regex, ça va planter. On retourne à la case départ.

Lien à poster

Ben ouais, le problème de ce genre de langage de scripting, c'est que ça reste un langage de programmation... Simplifié et spécialisé, certes, mais faut apprendre.

sikuli me semble plus simple à apprendre qu'autoit, dans ce domaine.

Lien à poster

Non. Contacter EMC2 n'est pas dans mes attributions. En revanche, je vais faire un rapport qui sera...

-- "Mis dans un placard ?

-- ... Euh ? Oui. " :)

Comme d'hab' > boulot de fonctionnaire : missions, rapports et autres trucs ALC

Lien à poster
  • 4 semaines après...

echo "N° O.S. 80370-2013-6742 Décompte 001 Type TD" | awk '{print $3$5}' | sed "s/\-20//

s/\-//"

ou encore :

echo "N° O.S. 80370-2013-6742 Décompte 001 Type TD" | awk '{print $3$5}' | cut -c1-5,9,10,12-

et plein d'autres solutions de ce type (sous GNU/Linux et n'importe quel autre UNIX).

Lien à poster

Nan mais, c'est resolu : on a le regexp qu'il faut, on a decouvert un bug dans le logiciel cible et on a même découvert l'origine exacte du bug et sa resolution possible.

Et comme l'utilisation du logiciel en question est obligatoire, on a aussi une solution moche et bancale pour contourner le problème ...

Ah oui, et c'est sous windows only sans droits admins :p

Lien à poster

Ok les dudes (et 76 aussi, s'il lit ce post)... La soluce de ce problème aurait de toute façon dépassé mes limites puisque c'est carrément l'ingé à qui j'ai refilé le bébé "Regex" avec mes remarques (celles de momo en réalité... Merci momo ;) ) -- oui, je suis un usurpateur d'identité -- qui a dû concocter un p'tit programme hors module de regex (du programme principal) parce qu'avec ce soft... ben c'est pas possible.

Selon lui, c'est normal que mon truc n'ait pas fonctionné, à cause du | (pipe pour les intimes... et au lit !).

... Ben tiens ! On l'aurait jamais cru. :D

Faut d'ailleurs que je pense un de ces quatre à lui en retoucher un mot, histoire qu'il me file ce p'tit bout de prog qu'il a écrit (histoire de le mettre ici... et qu'on se marre).

Bref, mon truc n'a servi à rien (ou peut-être qu'il s'en est servi) et TLMSEF puisque maintenant, ça fonctionne.

"Saint-cloud verrerie moche" pour les conseils avisés. :)

Et merci Béru (San-Antonio) pour les trad° Français-Engliche.

Lien à poster

Selon lui, c'est normal que mon truc n'ait pas fonctionné, à cause du | (pipe pour les intimes... et au lit !).

Wait...what?

C'est sensé être des expressions regulieres, et le pipe est l'une des fondations de ce bordel...

C'est quoi la logique derriere ?

"Je vais copier les plans d'une lamborghini diablo mais je vais pas mettre de freins, ça ira plus vite" ?

Lien à poster
×
×
  • Créer...