Deutsch English Français Italiano |
<87y269vcd4.fsf@izac.org> View for Bookmarking (what is this?) Look up another Usenet article |
X-Received: by 2002:adf:d1ce:: with SMTP id b14mr29015547wrd.42.1635668135964; Sun, 31 Oct 2021 01:15:35 -0700 (PDT) Path: ...!news-out.google.com!nntp.google.com!proxad.net!feeder1-2.proxad.net!fdn.fr!news.ortolo.eu!news.izac.org!reader From: Benoit Izac <use.reply.to@INVALID.ADDRESS> Newsgroups: fr.comp.lang.regexp Subject: Re: Une regexp est recherchee Date: Sun, 31 Oct 2021 09:15:35 +0100 Message-ID: <87y269vcd4.fsf@izac.org> References: <regexp-20211031015833@ram.dialup.fu-berlin.de> Reply-To: benoit.izac@free.fr Mime-Version: 1.0 Injection-Info: keg.izac.org; logging-data="3826850"; mail-complaints-to="usenet@izac.org" Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Bytes: 3410 Lines: 78 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