Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

replace in String intelligent

6 réponses
Avatar
OdarR
salut,

comment feriez-vous ceci : un remplacement de tag dans une String,
avec
une valeur qui =E9volue =E0 chaque occurence.

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

deviendrait apr=E8s un remplacement intelligent et efficace:

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

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

merci,

Olivier

6 réponses

Avatar
Pierre Quentel
On Feb 16, 5:02 pm, 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)
    ...

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
Avatar
OdarR
On 16 fév, 21:08, Pierre Quentel wrote:
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
Avatar
laurent
OdarR a écrit :
On 16 fév, 21:08, Pierre Quentel wrote:
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
Avatar
Boris Borcic
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
Avatar
Pierre Maurette
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
Avatar
Boris Borcic
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'
>>>