Sujet : Re: Une regexp est recherchee
De : use.reply.to (at) *nospam* INVALID.ADDRESS (Benoit Izac)
Groupes : fr.comp.lang.regexpDate : 31. Oct 2021, 10:15:35
Autres entêtes
Message-ID : <87y269vcd4.fsf@izac.org>
References : 1
Bonjour,
Le 31/10/2021 à 02:20, Stefan Ram a écrit dans le message
<
regexp-20211031015833@ram.dialup.fu-berlin.de> :
Une regexp est recherchée
>
Étant donné le texte suivant :
>
<li>xyzzy<a>wr$g<span>ALPHA</span>aef a:iue</a>a/li-aeif</li>
<li>abc cb<a>wro/ghqiu<span>BETA</span>anfea+uie</a>ei!rqiu</li>
<li>48 4/li_99<a>e//og ai<span>GAMMA</span>a^ue ui</a>ne fi.a iq</li>
<li>285289<a>äirh`iuah<span>EPSILON</span>afi uahui</a>erih(aeui</li>
>
La division en lignes dans cet affichage n'est faite que
pour des raisons de clarté. Ce que l'on veut dire, c'est
que le texte est une longue ligne unique.
>
Vous voyez quatre sous-textes, dont chacun commence par
"<li>" et se termine par "</li>".
>
Ces textes partiels contenant "GAMMA" doivent maintenant
être supprimés à l'aide d'un programme capable de rechercher
des regexps et de les remplacer par d'autres textes.
>
Le résultat devrait donc être le suivant :
>
<li>xyzzy<a>wr$g<span>ALPHA</span>aef a:iue</a>afji-aeif</li>
<li>abc cb<a>wro/ghqiu<span>BETA</span>anfea+uie</a>ei!rqiu</li>
<li>285289<a>äirh`iuah<span>EPSILON</span>afi uahui</a>erih(aeui</li>
>
. J'aimerais donc avoir une commande comme suit :
>
Remplacer tous les sous-textes correspondant à le regexp
"..." par "" (rien).
>
Mais que serait cette regexp ?
>
La tentative naïve qui suit, échoue sûrement !
>
(écrit en Python)
>
import re
>
source = \
"<li>xyzzy<a>wr$g<span>ALPHA</span>aef a:iue</a>a/li-aeif</li>"\
"<li>abc cb<a>wro/ghqiu<span>BETA</span>anfea+uie</a>ei!rqiu</li>"\
"<li>48 4/li_99<a>e//og ai<span>GAMMA</span>a^ue ui</a>ne fi.a iq</li>"\
"<li>285289<a>äirh`iuah<span>EPSILON</span>afi uahui</a>erih(aeui</li>"
>
print( re.sub( "<li>.*?GAMMA.*?</li>", "", source ))
>
qui imprime
>
<li>285289<a>äirh`iuah<span>EPSILON</span>afi uahui</a>erih(aeui</li>
>
. Je me demande si cela est possible !
Je n'ai pas trouvé pour le faire avec une regex sans un truc pourri mais
on peut s'en sortir autrement :
print(''.join(
[s for s in re.findall('<li>.*?</li>', source)
if s.find('GAMMA') == -1]))
La bonne méthode (qui marche dans toutes les situations) serait
d'utiliser un parser HTML ou XML.
Le truc pourri :
print( re.sub( "<li>.(?:(?<!<li>).)*GAMMA.*?</li>", "", source ))
Donc « <li> » suivi d'un caractère, suivi de zéro ou plus caractère(s)
qui ne sont pas précédés de « <li> ».
Évidemment ça va bouffer BETA si on a « <li>GAMMA… ».
-- Benoit Izac