replace in String intelligent

Le
OdarR
salut,

comment feriez-vous ceci : un remplacement de tag dans une String,
avec
une valeur qui évolue à chaque occurence.

du genre :
".TAGTAG.TAG.TAG"

deviendrait après un remplacement intelligent et efficace:

".TAG01TAG02.TAG03.TAG04"

c'est sûrement possible avec autre chose qu'un
while TAG in mystring:
mystring=mystring.replace(TAG, TAG+str(compteur), 1)


merci,

Olivier
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pierre Quentel
Le #18685171
On Feb 16, 5:02 pm, OdarR
salut,

comment feriez-vous ceci : un remplacement de tag dans une String,
avec
une valeur qui évolue à chaque occurence.

du genre :
".......TAG............TAG................TAG..........TAG"

deviendrait après un remplacement intelligent et efficace:

".......TAG01............TAG02................TAG03..........TAG04"

c'est sûrement possible avec autre chose qu'un
while TAG in mystring:
    mystring=mystring.replace(TAG, TAG+str(compteur), 1)
    ...

merci,

Olivier



Bonsoir,

C'est là que le module re s'impose :

========
import re

orig= ".......TAG............TAG................TAG..........TAG"

cpt = 0

def repl(mo):
global cpt
cpt += 1
return mo.string[mo.start():mo.end()]+"%02d" %cpt

print re.sub("TAG",repl,orig)
=========

Les expressions régulières, ça paraît super compliqué au début, mais
pour des manipulations un peu complexes comme celle dont tu as besoin
c'est vraiment LA solution

- Pierre
OdarR
Le #18685681
On 16 fév, 21:08, Pierre Quentel
Bonsoir,

C'est là que le module re s'impose :

========
import re

orig= ".......TAG............TAG................TAG..........TAG"

cpt = 0

def repl(mo):
    global cpt
    cpt += 1
    return mo.string[mo.start():mo.end()]+"%02d" %cpt

print re.sub("TAG",repl,orig)
=========

Les expressions régulières, ça paraît super compliqué au débu t, mais
pour des manipulations un peu complexes comme celle dont tu as besoin
c'est vraiment LA solution

- Pierre



ça fait peur, effectivement, j'ai du mal avec les re.
ceci dit, je vais comparer plusieurs méthodes, dont la tienne, et
ferai le point.
merci Pierre,

Olivier
laurent
Le #18686551
OdarR a écrit :
On 16 fév, 21:08, Pierre Quentel
Bonsoir,

C'est là que le module re s'impose :

======= >> import re

orig= ".......TAG............TAG................TAG..........TAG"

cpt = 0

def repl(mo):
global cpt
cpt += 1
return mo.string[mo.start():mo.end()]+"%02d" %cpt





ou bien:

return mo.group(0) + '%02d' % cpt

ou encore:

return mo.group() + '%02d' % cpt

C'est un peu plus rapide à saisir au clavier, mais pas forcément plus
lisible :(


Laurent
Boris Borcic
Le #18689321
OdarR wrote:
salut,

comment feriez-vous ceci : un remplacement de tag dans une String,
avec
une valeur qui évolue à chaque occurence.

du genre :
".......TAG............TAG................TAG..........TAG"

deviendrait après un remplacement intelligent et efficace:

".......TAG01............TAG02................TAG03..........TAG04"

c'est sûrement possible avec autre chose qu'un
while TAG in mystring:
mystring=mystring.replace(TAG, TAG+str(compteur), 1)
...



"solution" qui bouclera sans fin à la première occurrence de TAG


merci,

Olivier



Bon pour une solution sans re, peut-être quelque chose comme ça (pas testé).
Ceci dit il n'y a en fait pas véritablement d'expression régulière dans la
solution de Pierre, juste l'emploi d'une fonctionnalité du module.

from itertools import count as N
tagk = iter(TAG+str(k) for k in N(1)).next
strs = iter(mystring.split(TAG)).next
result = ''.join([strs,tagsk][k%2]() for k in N())

hth, bb
Pierre Maurette
Le #18690191
Boris Borcic, le 17/02/2009 a écrit :

[...]

Bon pour une solution sans re, peut-être quelque chose comme ça (pas testé).
Ceci dit il n'y a en fait pas véritablement d'expression régulière dans la
solution de Pierre, juste l'emploi d'une fonctionnalité du module.

from itertools import count as N
tagk = iter(TAG+str(k) for k in N(1)).next
strs = iter(mystring.split(TAG)).next
result = ''.join([strs,tagsk][k%2]() for k in N())



Je crains qu'il puisse y avoir un problème en cas de TAG initial, TAG
final, séquences TAGTAG...

Voir un fil "Remplacer les occurrences de TRUC dans une chaîne par
les éléments d'une séquence" de Francois, le 24/10/2008 à 17:45:23

--
Pierre Maurette
Boris Borcic
Le #18692561
Pierre Maurette wrote:
Boris Borcic, le 17/02/2009 a écrit :

[...]

Bon pour une solution sans re, peut-être quelque chose comme ça (p as
testé). Ceci dit il n'y a en fait pas véritablement d'expression
régulière dans la solution de Pierre, juste l'emploi d'une
fonctionnalité du module.

from itertools import count as N
tagk = iter(TAG+str(k) for k in N(1)).next
strs = iter(mystring.split(TAG)).next
result = ''.join([strs,tagsk][k%2]() for k in N())



Je crains qu'il puisse y avoir un problème en cas de TAG initial, TAG
final, séquences TAGTAG...



Non, il y a un problème qui ne dépend pas des TAG dans la source : la boucle
finit toujours sur un TAGn final même s'il n'y en a pas dans la source.


Voir un fil "Remplacer les occurrences de TRUC dans une chaîne pa r
les éléments d'une séquence" de Francois, le 24/10/2008 à 17:45 :23




Mon newserver ne les conserve pas aussi longtemps, et j'ai la flemme
d'interpeller google news. Par contre, une version corrigée (d'accord, c'est
plutôt laid).

>>> def test(mystring,TAG='TAG') :
from itertools import count as N
tagk = iter(TAG +("%02i"%k) for k in N(1)).next
strs = mystring.split(TAG)
strsit = iter(strs).next
return ''.join([strsit,tagk][k%2]() for k in xrange(2*len(strs)-1))

>>> test('TAG')
'TAG01'
>>> test('foobar')
'foobar'
>>> test('TAGTAG')
'TAG01TAG02'
>>> test('xTAGyTAGz')
'xTAG01yTAG02z'
>>> test('xTAGyTAGz')
'xTAG01yTAG02z'
>>> test('xTAGyTAG')
'xTAG01yTAG02'
>>> test('TAGyTAG')
'TAG01yTAG02'
>>>
Publicité
Poster une réponse
Anonyme