# Perl regexp: négation d'un pattern

**URL:** <https://www.debian-fr.org/t/perl-regexp-negation-dun-pattern/75304>\
**Category:** Programmation\
**Created:** [Décembre 6, 2017, 3:23 UTC](https://www.debian-fr.org/t/perl-regexp-negation-dun-pattern/75304 "2017-12-06T15:23:03Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Décembre 6, 2017, 3:23 UTC](https://www.debian-fr.org/t/perl-regexp-negation-dun-pattern/75304/1 "2017-12-06T15:23:04Z")

</div>

Bonjour,

(Perl 5.20 de Jessie: use 5.20.0;)  
je cherche à capturer 3 champs dans une ligne ainsi composée:

1. un préfixe numérique à ignorer  
début deligne/espace/nombre/point espace
2. un nom à capturer ($1)  
un mot (alphanumérique, tiret) = nom d’un package
3. une phrase à capturer ($2) = une description
4. une liste à capurer ($3)  
une liste de noms de fichiers nom.pdf, séparés par une virgule et un ou des espace, terminé en principe par un point, mais parfois une virgule,parfois rien (fin de ligne)  
«nom.pdf, nom2.pdf, … nomx.pdf[.,]\s\*\z»

J’échoue à trouver comment interrompre l’identification de la phrase juste avant le premier «nom.pdf», ma regexp ne différencie que le dernier nom.pdf de la liste, englobant les autres dans la description, c’est à dire à exprimer ‹&nbsp;tout sauf $PDF&nbsp;›

Voici la regexp:[regexpPDF.txt](https://www.debian-fr.org/uploads/default/original/2X/a/a782a4a25e4761cd9094ffaf7e505079e77f9a00.txt) (869 Octets)

Merci

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Décembre 6, 2017, 4:07 UTC](https://www.debian-fr.org/t/perl-regexp-negation-dun-pattern/75304/2 "2017-12-06T16:07:08Z")

</div>

Juste comme ça, j’aurais cherché [une solution du coté de awk, cut, tr](https://www.linuxtricks.fr/wiki/manipulation-de-chaine-cut-awk-tr) perso, plutôt que de faire ça en perl.  
D’ailleurs, si ce qui t’intéresse, c’est juste de choper ton $1 et ton $2, et s’ils sont bien entourés d’espaces, un truc genre **cut -d" " -f2-3 tonfichier** devrait suffire.

Mais bon, sinon, j’ai un peu de mal à voir le problème, tu ne pourrais pas fournir quelques lignes de ton fichier à parser qui posent problème, qu’on comprenne mieux ?

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Décembre 6, 2017, 7:18 UTC](https://www.debian-fr.org/t/perl-regexp-negation-dun-pattern/75304/3 "2017-12-06T19:18:54Z")

</div>

Il s’agit d’une fonction dans un script Perl.

J’ai choisi Perl plut ôt que Bash et ses compagnons, a priori pour sa puissance à traiter du texte, peut-être à tord (la puissance du langage n’étant pas celle du programmeur!)

Voici 3 lignes données par Dumper(@paragraphes) du tableau que je veux exploiter:

(c’est un premier traitement par Perl du fichier texlive:

> texmf-dist/doc/texlive/index.html

passé par _w3m_ pour le récupérer au format txt.)

```
$VAR984 = '984. flashmovie: Directly embed flash movies into PDF files test-beamer-0.pdf, test-flv.pdf.';
$VAR985 = '985. flipbook: Typeset flipbook animations, in the corners of documents im01.pdf, im02.pdf, im03.pdf, im04.pdf, im05.pdf, im06.pdf, im0.pdf, im1.pdf, im10.pdf, im11.pdf, im12.pdf, im13.pdf, im14.pdf, im15.pdf, im16.pdf, im2.pdf, im3.pdf, im4.pdf, im5.pdf, im6.pdf, im7.pdf, im8.pdf, im9.pdf, flipbook-doc.pdf, flipbook-ex.pdf.';
$VAR986 = '986. flippdf: Horizontal flipping of pages with pdfLaTeX flippdf.pdf.';

```

La difficulté vient du format qui ne différencie pas les espaces dans la phrase description de l’espace qui inaugure la liste des fichiers pdf. Je ne vois pas bien comment utiliser _cut_ dans ce contexte.

Il est possible que l’utilisation de la fonction _split_ de perl soit aussi une piste (à explorer).

L’enjeu est essentiellement pour moi de me remettre à Perl, après des années de quasi inutilisation, mais une solution autre m’intéresse autant.

Merci

PS  
Voici le résultat correspondant de mon code:

```
nom: flashmovie
comment: Directly embed flash movies into PDF files test-beamer-0.pdf,   
$VAR1 = ' test-flv.pdf';
nom: flipbook
comment: Typeset flipbook animations, in the corners of documents im01.pdf, im02.pdf, im03.pdf, im04.pdf, im05.pdf, im06.pdf, im0.pdf, im1.pdf, im10.pdf, im11.pdf, im12.pdf, im13.pdf, im14.pdf, im15.pdf, im16.pdf, im2.pdf, im3.pdf, im4.pdf, im5.pdf, im6.pdf, im7.pdf, im8.pdf, im9.pdf, flipbook-doc.pdf,
$VAR1 = ' flipbook-ex.pdf';
nom: flippdf
comment: Horizontal flipping of pages with pdfLaTeX
$VAR1 = ' flippdf.pdf';

```

où on voit qu’il n’y a qu’une seule variable au tableau des pdf ($3) (le dernier de la ligne), et que les autres sont restés dans la chaine de description ($2)

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Décembre 6, 2017, 7:51 UTC](https://www.debian-fr.org/t/perl-regexp-negation-dun-pattern/75304/4 "2017-12-06T19:51:12Z")

</div>

Une autre idée simple à explorer:

récupérer d’abord la liste des pdf (en les supprimant) dans une première regexp!

(je vous tiendrais au courant, sans doute pas avant samedi ou dimanche)

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Décembre 26, 2017, 8:16 UTC](https://www.debian-fr.org/t/perl-regexp-negation-dun-pattern/75304/5 "2017-12-26T08:16:14Z")

</div>

> [@josephtux](#):
>
> J’échoue à trouver comment interrompre l’identification de la phrase juste avant le premier «nom.pdf», ma regexp ne différencie que le dernier nom.pdf de la liste, englobant les autres dans la description, c’est à dire à exprimer ‹&nbsp;tout sauf $PDF&nbsp;›

Tu peux utiliser des quantificateurs non gourmands : [Apprendre, débuter en programmation Perl](http://lhullier.developpez.com/tutoriels/perl/intro/#LVIII-Q)

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Janvier 3, 2018, 3:21 UTC](https://www.debian-fr.org/t/perl-regexp-negation-dun-pattern/75304/6 "2018-01-03T15:21:52Z")

</div>

Oui, merci kna

depuis je me suis replongé dans «Maitrise des expressions régulières», pour rafraichir ma mémoire; malheureusement je ne dispose pas de tout le temps (ni des ressources de ma jeunesse), et mon script est aux oubliettes.

L’exercice reste utile et j’y reviendrai sans doute.
