Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Une regexp est recherchee

1 view
Skip to first unread message

Olivier Miakinen

unread,
Oct 31, 2021, 2:19:07 AM10/31/21
to
Bonjour,


Le 31/10/2021 02:20, Stefan Ram a écrit :
>
> [...]
>
> 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.
>
> [...]
>
> print( re.sub( "<li>.*?GAMMA.*?</li>", "", source ))
>
> qui imprime
>
> <li>285289<a>äirh`iuah<span>EPSILON</span>afi uahui</a>erih(aeui</li>

Je n'ai pas le temps de tester aujourd'hui, mais cherche du côté des assertions.
Probablement un truc de ce genre :

print( re.sub( "<li>(.(?!<li>))*GAMMA.*?</li>", "", source ))

Si ça ne fonctionne pas, je verrai ce soir (si je ne suis pas trop fatigué)
ou à partir de demain.

--
Olivier Miakinen

Benoit Izac

unread,
Oct 31, 2021, 4:15:36 AM10/31/21
to
Bonjour,

Le 31/10/2021 à 02:20, Stefan Ram a écrit dans le message
<regexp-202...@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

Olivier Miakinen

unread,
Oct 31, 2021, 2:21:35 PM10/31/21
to
Le 31/10/2021 à 07:19, j'écrivais :
>
> print( re.sub( "<li>(.(?!<li>))*GAMMA.*?</li>", "", source ))

Testé ce soir sur <https://regex101.com/>. Ça marche finement. ;-)

--
Olivier Miakinen
0 new messages