OVH Cloud OVH Cloud

Petit piège ordinaire de fin de soirée

18 réponses
Avatar
jean-michel bain-cornu
Bonsoir,

Le problème étant de retirer '<br>' en fin de ligne,
'calendrier<br>'.strip('<br>')
donne 'calendrie' et non pas 'calendrier' comme on pourrait s'y attendre
si on ne lit pas la doc...

Pour arriver à cette fin, on peut utiliser :
if 'calendrier<br>'.endswith('<br>'):
'calendrier<br>'[:-4]

A cette heure là, je n'arrive pas à trouver mieux...
A+
jm

8 réponses

1 2
Avatar
erichuchet
il y aurait cela aussi, peut etre plus "clair" :

a='calendrier<br>'

print a[:-4]+a[-4:].replace('<br>','')
Avatar
erichuchet
il y aurait cela aussi, peut etre plus "clair" :

a='calendrier<br>'

print a[:-4]+a[-4:].replace('<br>','')
Avatar
Méta-MCI
C'est vrai ; mieux vaut faire une fonction :

def Rtrim(texte, suffix):
if texte.endswith(suffix):
return(texte[:-len(suffix)])
else:
return texte

@+

MCI
Avatar
jean-michel bain-cornu
wrote:
il y aurait cela aussi, peut etre plus "clair" :

a='calendrier<br>'

print a[:-4]+a[-4:].replace('<br>','')

Joli coup !

Merci à tous. Je mets tout ça dans le wiki.
jm

Un petit résumé des solutions:
def rstringStrip1(s1,s2):
r= s1
if s1.endswith(s2):
r= s[:-len(s2)]
return r
def rstringStrip2(s1,s2):
return s1[:len(s1)-len(s2)*(s1[-len(s2):]==s2)]
def rstringStrip3(s1,s2):
return s1[:-len(s2)]+s1[-len(s2):].replace(s2,'')
def rstringStrip4(s1,s2):
import re
return re.compile(s2+'$',re.MULTILINE).sub('',s1)
#--
s= 'calendrier<br>'
print rstringStrip1(s,'<br>')
print rstringStrip2(s,'<br>')
print rstringStrip3(s,'<br>')
print rstringStrip4(s,'<br>')

Avatar
Méta-MCI
Bonsoir !

Dans :

def rstringStrip1(s1,s2):
r= s1
if s1.endswith(s2):
r= s[:-len(s2)]
return r


Au lieu, d'utiliser la variable 'r', je préfère cette version :

def rstringStrip1(s1,s2):
if s1.endswith(s2):
return s1[:-len(s2)]
else:
return s1


Elle a l'avantage de ne faire qu'un traitement, selon le résultat du "if".
De plus, si "if" est false, il n'y aura aucune modification des objets
(internes).


@+

MCI
Avatar
erichuchet

Bonsoir !

Dans :

def rstringStrip1(s1,s2):
r= s1
if s1.endswith(s2):
r= s[:-len(s2)]
return r


Au lieu, d'utiliser la variable 'r', je préfère cette version :

def rstringStrip1(s1,s2):
if s1.endswith(s2):
return s1[:-len(s2)]
else:
return s1


Elle a l'avantage de ne faire qu'un traitement, selon le résultat du "i f".
De plus, si "if" est false, il n'y aura aucune modification des objets
(internes).


@+

MCI


tiens allez, encore mieux:

def rstringStrip1(s1,s2):
return (s1,s1[:-len(s2)])[s1.endswith(s2)]


comme ca meme pas de if :-)

Eric

Avatar
Encolpe Degoute
tiens allez, encore mieux:

def rstringStrip1(s1,s2):
return (s1,s1[:-len(s2)])[s1.endswith(s2)]

comme ca meme pas de if :-)


Chouette, du PERL.

--
Encolpe DEGOUTE
http://encolpe.degoute.free.fr/
Logiciels libres, hockey sur glace et autres activités cérébrales

Avatar
Méta-MCI
Bonsoir !

comme ca meme pas de if :-)




Oui, mais ça n'est pas optimisé du tout, car Python doit construire un
tuple, avant d'exécuter le test. (donc, la partie "s1[:-len(s2)]" sera
systématiquement calculée, que ce soit nécessaire ou non).


@-salutations

Michel Claveau



1 2