BBedit et GREP

symbol

Membre actif
13 Octobre 2004
536
25
Bonjour

J'utilise BBedit.

Je souhaite trouver dans les lignes de texte (voir ci dessous), les lignes ou se trouvent seulement 4 impairs et le restant pairs.


(En réalité il y a 150 000 lignes dans mon fichier texte, je n'en ai mis que quelqu'une pour l'exemple)

- 01 - 02 - 03 - 07 - 08 - 09 - 14 - 19 - 22 - 24 - 26 - 28 -
- 02 - 03 - 05 - 07 - 09 - 12 - 14 - 17 - 20 - 21 - 23 - 25 -
- 01 - 06 - 07 - 08 - 10 - 11 - 14 - 15 - 17 - 19 - 24 - 25 -
- 05 - 07 - 11 - 12 - 13 - 14 - 15 - 17 - 19 - 20 - 21 - 24 -
- 01 - 02 - 09 - 10 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 27 -
- 01 - 03 - 04 - 13 - 14 - 17 - 19 - 20 - 22 - 25 - 26 - 27 -

Si quelqu'un connait la syntaxe exacte.
J'ai essayé [012][02468].*[012][13579].* , mais je ne sais pas comment indiqué que je ne veux que les lignes avec 4 pairs !

Merci
 
Dernière édition:
En fait, ta question porte sur les expressions régulières.

Et tu peux résoudre ton problème (trouver l'expression régulière adéquate) en passant par la modélisation d'automates finis déterministes.
 
vu qu'il a précisé [012] dans son expression, c'est qu'il ne s'intéresse qu'aux unités.



dans ce cas,

([\d][13579].*){4} devrait faire l'affaire pour révéler les lignes avec 4 impairs ou plus

Mais cherche-t-on exactement 4 nombres impairs ou au moins 4 nombres impairs ?

Parce que exactement 4 pairs, c'est moins drôle à priori ;)
 
Dernière édition:
Tu as raison : c'est en remerciant les gens qui te donnent des pistes que tu vas réussir.


Un touriste te demande la rue machin, tu lui dis "76° par rapport au soleil"... Tu vois bien grotesque de la situation.

---------- Nouveau message ajouté à 09h59 ---------- Le message précédent a été envoyé à 09h53 ----------

vu qu'il a précisé [012] dans son expression, c'est qu'il ne s'intéresse qu'aux unités.



dans ce cas,

([\d][13579].*){4} devrait faire l'affaire pour révéler les lignes avec 4 impairs ou plus

Mais cherche-t-on exactement 4 nombres impairs ou au moins 4 nombres impairs ?

Parce que exactement 4 pairs, c'est moins drôle à priori ;)


Merci de ta réponse.


- Ta solution fonctionne très bien mais me donne les lignes avec au moins 4 pairs
Je souhaite trouver les lignes avec exactement 4 nombres impairs (nombres = 01 03 05 07 09 11 13 etc...)
 
Dernière édition:
Un touriste te demande la rue machin, tu lui dis "76° par rapport au soleil"... Tu vois bien grotesque de la situation.

Je te confirme que ton exemple est grotesque... et sans rapport.

Je t'indique ce qui va te permettre de résoudre ton problème... Car il s'agit bien d'un problème mathématique/logique. Et c'est bien via les automates que tu vas pouvoir définir ton expression régulière ("exactement 4 nombres impairs").
Maintenant, si tu ne veux pas faire l'effort de la réflexion, reste.

Dans ce cas, plutôt que de faire preuve d'"intelligence" avec une expression régulière, tu peux aussi faire moins intelligent avec un programme qui va te compter les occurrences par ligne et te retourner ok/pas ok selon que c'est égal à 4 ou non.

Je t'aurai bien dirigé vers des docs/cours nécessaires à ton problème (parce que tu peux toujours réver pour que je pose le problème sur feuille et que je le résolve pour toi) mais comme tu semble peu enclin à réfléchir, je vais m'abstenir de t'aider.

Aller, je suis gentil... On peut voir les choses de façon "bête" puisque ton nombre de nombres est fixe: 12 par ligne. --> donc si tu as exactement 4 impairs, c'est que tu as 8 pairs. Ca devient très simple pour ton expressions régulière vu comme ça, non? ;)
(mais ça ne fonctionnera plus si tu passes à autre chose que 12 nombres)
 
Dernière édition:
Mon problème c'est que les impairs et impairs sont mélangés.
Detecter 4 pairs + 8 impairs ou inversion je sais le faire uniquement si ils sont deja classé, par exemple

01 - 03 - 05 - 07 - 12 -14 - 18 - 22 - 24 - 26 - 28 - 30 <- je sais detecter ca
je fais [012][13579] - [012][13579] - [012][13579] - [012][13579] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468]

01 - 02 - 06 - 07 - 12 - 14 - 16 - 19 - 20 - 22 - 27 - 30 <-- ca je ne sais pas, car les impairs et paris sont placés des façon aléatoire

J'ai essayé ([012][013579].*){4} mais ca donne aussi des lignes avec plus de 4 impairs

Il me semblait que {4} indiquait le nombre de fois que l'on voulait trouver une occurrence.
 
Dernière édition:
Il me semblait que {4} indiquait le nombre de fois que l'on voulait trouver une occurrence.
Le premier chiffre donne le nombre minimal, et le deuxième donne le nombre maximal.
S'il n'y a qu'un seul chiffre, c'est le minimal, donc il faut que tu remplaces l'expression entre accolades par : {4,4}
:)
 
Le premier chiffre donne le nombre minimal, et le deuxième donne le nombre maximal.
S'il n'y a qu'un seul chiffre, c'est le minimal, donc il faut que tu remplaces l'expression entre accolades par : {4,4}
:)


le {4,4} me trouve la ligne

- 03 - 04 - 06 - 08 - 09 - 12 - 13 - 14 - 15 - 19 - 20 - 22 -

alors qu'elle possède 5 impairs.
 
Bloc de code:
^(?!(([\d][13579].*){5})).*([\d][13579].*){4}$
testé sur:
Bloc de code:
01 - 02 - 06 - 07 - 12 - 14 - 16 - 19 - 20 - 22 - 27 - 30
01 - 03 - 05 - 07 - 12 - 14 - 18 - 22 - 24 - 26 - 28 - 30
01 - 02 - 05 - 07 - 12 - 14 - 18 - 22 - 24 - 26 - 28 - 30
01 - 03 - 05 - 07 - 12 - 14 - 18 - 22 - 24 - 26 - 28 - 25
02 - 05 - 03 - 06 - 02 - 04 - 04 - 03 - 12 - 16 - 54 - 33
02 - 05 - 03 - 06 - 02 - 04 - 04 - 03 - 12 - 16 - 33 - 54
Valide les lignes 1-2-5-6 (ce qui me semble représentatif)

---------- Nouveau message ajouté à 20h34 ---------- Le message précédent a été envoyé à 20h27 ----------

{n,m} (et donc {4,4}) est invalide dans notre exemple car il sert à exprimer un nombre de répétition possible d'un motif (ça prend un sens dans le cas d'un motif complexe) sans que la répétition m+1 soit invalide.
En fait, il suffit que l'expression régulière soit validée à 4 pour qu'on n'aille pas plus loin et qu'on la considère valide. Ca prendrait un sens si on considérait quelque chose après ce 4e motif dans le cas de {n,m}.

Dans mon cas, j'exclue une répétition de 5 fois le motif, puis je valide du au moins 4 (donc strictement 4 puisque j'ai exclue 5). Et je considère le début et le fin de ligne pour ne pas valider un milieu de ligne (qui aurait 4 alors que le début en avait déjà 1).
 
Je viens de tester ^(?!(([\d][13579].*){5})).*([\d][13579].*){4}$

et ca me trouve la ligne

- 01 - 02 - 04 - 05 - 07 - 12 - 14 - 15 - 19 - 23 - 24 - 28 -

elle contient 6 impairs, on en veut que 4 et par conséquent 8 pairs


Afin de comprendre le processus, serait il possible d'indiquer la syntaxe en détail ?
 
Je viens de tester ^(?!(([\d][13579].*){5})).*([\d][13579].*){4}$

et ca me trouve la ligne

- 01 - 02 - 04 - 05 - 07 - 12 - 14 - 15 - 19 - 23 - 24 - 28 -

elle contient 6 impairs, on en veut que 4 et par conséquent 8 pairs

Chez moi ça fonctionne, elle ne valide pas:
Bloc de code:
01 - 02 - 04 - 05 - 07 - 12 - 14 - 15 - 19 - 23 - 24 - 28
Tes lignes sont précédées et se terminent par "-"? (parce que moi je considère les débuts et fins de ligne)

---------- Nouveau message ajouté à 20h39 ---------- Le message précédent a été envoyé à 20h38 ----------

Si tes lignes sont (avec un tiret au début et à la fin):
Bloc de code:
- 01 - 02 - 06 - 07 - 12 - 14 - 16 - 19 - 20 - 22 - 27 - 30 -
- 01 - 03 - 05 - 07 - 12 - 14 - 18 - 22 - 24 - 26 - 28 - 30 -
- 01 - 02 - 05 - 07 - 12 - 14 - 18 - 22 - 24 - 26 - 28 - 30 -
- 01 - 03 - 05 - 07 - 12 - 14 - 18 - 22 - 24 - 26 - 28 - 25 -
- 02 - 05 - 03 - 06 - 02 - 04 - 04 - 03 - 12 - 16 - 54 - 33 -
- 02 - 05 - 03 - 06 - 02 - 04 - 04 - 03 - 12 - 16 - 33 - 54 -
- 01 - 02 - 04 - 05 - 07 - 12 - 14 - 15 - 19 - 23 - 24 - 28 -
alors c'est:
Bloc de code:
^- (?!(([\d][13579].*){5})).*([\d][13579].*){4} -$
...
 
Dernière édition:
Je viens de reessayer

^- (?!(([\d][13579].*){5})).*([\d][13579].*){4} -$

avec les lignes ci-dessous



- 03 - 04 - 06 - 08 - 09 - 12 - 13 - 14 - 15 - 19 - 20 - 22 -
- 01 - 02 - 03 - 07 - 08 - 10 - 11 - 12 - 13 - 21 - 22 - 26 -
- 02 - 08 - 12 - 13 - 15 - 17 - 20 - 22 - 23 - 24 - 25 - 28 -
- 02 - 04 - 05 - 07 - 12 - 15 - 20 - 21 - 22 - 24 - 25 - 26 -
- 01 - 02 - 04 - 05 - 07 - 12 - 14 - 15 - 19 - 23 - 24 - 28 -
- 01 - 04 - 06 - 08 - 09 - 11 - 16 - 18 - 21 - 23 - 24 - 27 -
- 01 - 03 - 04 - 09 - 10 - 12 - 15 - 20 - 21 - 24 - 25 - 28 -
- 02 - 03 - 05 - 08 - 10 - 11 - 12 - 16 - 21 - 23 - 24 - 26 -
- 02 - 08 - 10 - 11 - 12 - 15 - 17 - 20 - 22 - 23 - 25 - 27 -
- 01 - 03 - 05 - 09 - 10 - 12 - 13 - 14 - 15 - 21 - 22 - 23 -
- 03 - 11 - 12 - 13 - 14 - 15 - 17 - 19 - 22 - 24 - 27 - 28 -
- 01 - 02 - 03 - 07 - 08 - 09 - 14 - 19 - 22 - 24 - 26 - 28 -
- 02 - 03 - 05 - 07 - 09 - 12 - 14 - 17 - 20 - 21 - 23 - 25 -
- 01 - 06 - 07 - 08 - 10 - 11 - 14 - 15 - 17 - 19 - 24 - 25 -
- 05 - 07 - 11 - 12 - 13 - 14 - 15 - 17 - 19 - 20 - 21 - 24 -
- 01 - 02 - 09 - 10 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 27 -
- 01 - 03 - 04 - 13 - 14 - 17 - 19 - 20 - 22 - 25 - 26 - 27 -
- 02 - 04 - 08 - 13 - 14 - 16 - 19 - 20 - 22 - 25 - 26 - 28 -
- 01 - 04 - 06 - 07 - 08 - 11 - 13 - 15 - 16 - 20 - 25 - 26 -
- 02 - 04 - 07 - 08 - 10 - 11 - 12 - 20 - 21 - 22 - 23 - 28 -
- 02 - 05 - 06 - 10 - 12 - 14 - 15 - 18 - 19 - 20 - 25 - 27 -
- 01 - 03 - 10 - 14 - 15 - 17 - 18 - 19 - 20 - 22 - 23 - 27 -
- 01 - 02 - 05 - 12 - 14 - 16 - 17 - 18 - 24 - 25 - 26 - 28 -
- 02 - 04 - 07 - 13 - 14 - 15 - 16 - 20 - 21 - 22 - 23 - 28 -
- 02 - 03 - 04 - 06 - 07 - 10 - 13 - 14 - 15 - 22 - 24 - 28 -
- 05 - 06 - 09 - 10 - 12 - 13 - 14 - 18 - 19 - 21 - 27 - 28 -
- 05 - 07 - 11 - 12 - 13 - 17 - 18 - 22 - 23 - 24 - 25 - 26 -

il me trouve les lignes

- 02 - 08 - 12 - 13 - 15 - 17 - 20 - 22 - 23 - 24 - 25 - 28 - <---- 5 impairs
- 02 - 04 - 05 - 07 - 12 - 15 - 20 - 21 - 22 - 24 - 25 - 26 - <---- 5 impairs
- 02 - 03 - 05 - 08 - 10 - 11 - 12 - 16 - 21 - 23 - 24 - 26 - <---- 4 impairs
- 02 - 08 - 10 - 11 - 12 - 15 - 17 - 20 - 22 - 23 - 25 - 27 - <---- 6 impairs
- 02 - 03 - 05 - 07 - 09 - 12 - 14 - 17 - 20 - 21 - 23 - 25 - <---- 8 impairs
- 02 - 04 - 07 - 08 - 10 - 11 - 12 - 20 - 21 - 22 - 23 - 28 - <---- 4 impairs
- 02 - 05 - 06 - 10 - 12 - 14 - 15 - 18 - 19 - 20 - 25 - 27 - <---- 5 impairs
- 01 - 02 - 05 - 12 - 14 - 16 - 17 - 18 - 24 - 25 - 26 - 28 - <---- 3 impairs
- 02 - 04 - 07 - 13 - 14 - 15 - 16 - 20 - 21 - 22 - 23 - 28 - <---- 5 impairs
- 02 - 03 - 04 - 06 - 07 - 10 - 13 - 14 - 15 - 22 - 24 - 28 - <---- 4 impairs

bizarre

Mon texte est encoder UTF8 et fin de ligne Unix
 
Oui, j'ai vu ça.

Ma prise en compte des tirets supplémentaire au début et à la fin a été un peu hative :)
(ça ne fonctionne plus si le premier est pair)

---------- Nouveau message ajouté à 21h03 ---------- Le message précédent a été envoyé à 20h57 ----------

Du coup, on considère n'importe quoi avant (.*) pour gérer ce tiret du début:

Bloc de code:
^(?!((.*[\d][13579].*){5})).*([\d][13579].*){4}$


ocjb.png


Note que ta ligne
- 01 - 02 - 05 - 12 - 14 - 16 - 17 - 18 - 24 - 25 - 26 - 28 -
a bien 4 impairs:
- 01 - 02 - 05 - 12 - 14 - 16 - 17 - 18 - 24 - 25 - 26 - 28 -
(et pas 3 comme tu indiques)

---------- Nouveau message ajouté à 21h16 ---------- Le message précédent a été envoyé à 21h05 ----------

En bref, pour l'explication (si ça t'intéresse):
- on considère la ligne entière pour ne pas valider la condition que sur une partie de la ligne (sinon on trouve des faux-positifs, par exemple "- 01 - 03 - 05 - 07 - 12 - 14 - 18 - 22 - 24 - 26 - 28 - 25 -" est valide si on ne considère que "1 - 03 - 05 - 07 - 12 - 14 - 18 - 22 - 24 - 26 - 28 - 25 -") --> (^ $)
- on rejette (?!) d'entrée de jeu les lignes ayant 5 (ou plus) nombre impairs --> n'importe quel chiffre (\d) suivi de 1,2,3,5,7 ou 9 ([13579])
- on valide ensuite les lignes ayant 4 (ou plus) nombre impairs (donc strictement 4 puisque les lignes ayant 5 ou plus ont été rejetées).
(les nombres impairs ne sont pas forcément consécutifs et peuvent être entrecoupés (surtout avec ces tirets) de n'importe quoi (.*))

C'est tout.
 
Dernière édition:
  • J’aime
Réactions: da capo
Joli.

J'avais cherché dans cette direction aussi (si 5 ou plus n'est pas possible alors vérifier si 4 ou plus l'est), mais je n'avais pas réussi à faire fonctionner la conditionnelle.
Ou plus certainement, je n'avais pas bien géré le début de ligne.
 
da capo, en fait ce n'est pas vraiment une conditionnelle au sens algorithmique (si... alors...) mais une condition d'invalidité de la ligne qui stoppe l'analyse du reste (donc ça reste limité, mais utilisable ici).

Du coup, symbol a disparu...

Avec ça, on n'avait pas fini :D:
je fais [012][13579] - [012][13579] - [012][13579] - [012][13579] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468]
 
Je viens de tester sur une trentaine de lignes

^(?!((.*[\d][13579].*){5})).*([\d][13579].*){4}$

Cela fonctionne.

Je vais tester sur 158 000 lignes et voir le temps que cela prends.

J'ai l'impression que c'est très très long pour traiter 158 000, par rapport a ce que j'ai essayé avant, qui prenait seulement une dizaine de secondes pour 158 000 lignes.

Merci


MAJ : sur 158228 lignes -> 15000 lignes trouvées en environ 15 mn.
 
Dernière édition:
L'expression régulière

^(?!((.*[\d][13579].*){5})).*([\d][13579].*){4}$

vérifie beaucoup plus de chose que ton

[012][13579] - [012][13579] - [012][13579] - [012][13579] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468] - [012][02468]
(qui ne fait pas le job, elle valide juste 4impairs et 8pairs dans cette ordre strictement)

Elle valide toutes les combinaisons possibles.
Donc, si je ne m'abuse, elle doit vérifier 143 (12²-1) combinaisons de plus que l'autre.
(donc ça se tient en terme de durée)