Remplacer les occurrences de __TRUC__ dans une chaîne par les éléments d'une séquence
21 réponses
Francois
Bonjour à tous,
J'ai une chaîne de caractères ch qui contient par exemple 20
occurrences de la chaîne "__TRUC__". Elle en contient 20 occurrences
exactement car ch a été construite comme ça. Et j'ai une séquence seq
contenant 20 chaînes, comme par exemple :
seq = ['a0','a1',...,'a19']
Comment faire de manière la plus simple possible pour remplacer :
- la première occurrence de "__TRUC__" dans ch par 'a0'
- la deuxième occurrence de "__TRUC__" dans ch par 'a1'
.
.
.
- la vingtième occurrence de "__TRUC__" dans ch par 'a19' ?
Je sais par exemple que ch.replace("__TRUC__","xxx") remplace
toutes les occurrences de "__TRUC__" dans ch par "xxx". J'aimerais bien
savoir si on peut faire sans trop se fatiguer la même chose sauf qu'on
ne remplace pas toutes les occurrences par une même chaîne, mais par les
éléments d'une séquence de chaînes.
(et la chaîne a le droit de commencer par __TRUC__, donc tester aussi: chaine = "_TRUC_ 111 _TRUC_ 222 _TRUC_ 333 _TRUC_ 444 _TRUC_ 555" )
Sur cette base, la coquetterie de le faire en une ligne se payerait par un double appel à split(), puisque si j'ai bien lu une réponse qui m' a été faite sur ce forum il ne faut pas espérer d'optimisation. En deux lignes:
s = ch.split('zorglub') result = ''.join([a[0] + a[1] for a in zip(s, seq)] + [s[-1]])
avait été proposé dans la première réponse ;-)
-- Pierre Maurette
Bonsoir,
Bien vu Pierre, j'étais allé trop vite. Décidément, Lao-Tseu avait raison : "Méfie-toi des one-liners !". Et même des two-liners d'ailleurs, puisque ça marche mieux avec zip(s[:-1],seq)
A part ça, j'ai mesuré les temps de calcul, ça a l'air nettement plus rapide avec cette version qu'avec les expressions régulières
A+, Pierre
A+ Pierre
On 29 oct, 21:56, Pierre Maurette <maurettepie...@wanadoo.fr> wrote:
Pierre Quentel, le 29/10/2008 a écrit :
[...]
> Une autre solution en une ligne:
> print "".join(x+y for(x,y) in zip(chaine.split("_TRUC_"),subs))
> Ca marche bien dans ce cas,
Oui, dans ce cas. Avec:
chaine = 20*("zzz _TRUC_ ")
Mais le fait que la chaîne se termine par __TRUC__ est une exception. A
tester avec:
(et la chaîne a le droit de commencer par __TRUC__, donc tester aussi:
chaine = "_TRUC_ 111 _TRUC_ 222 _TRUC_ 333 _TRUC_ 444 _TRUC_ 555"
)
Sur cette base, la coquetterie de le faire en une ligne se payerait par
un double appel à split(), puisque si j'ai bien lu une réponse qui m' a
été faite sur ce forum il ne faut pas espérer d'optimisation.
En deux lignes:
s = ch.split('zorglub')
result = ''.join([a[0] + a[1] for a in zip(s, seq)] + [s[-1]])
avait été proposé dans la première réponse ;-)
--
Pierre Maurette
Bonsoir,
Bien vu Pierre, j'étais allé trop vite. Décidément, Lao-Tseu avait
raison : "Méfie-toi des one-liners !". Et même des two-liners
d'ailleurs, puisque ça marche mieux avec zip(s[:-1],seq)
A part ça, j'ai mesuré les temps de calcul, ça a l'air nettement plus
rapide avec cette version qu'avec les expressions régulières
(et la chaîne a le droit de commencer par __TRUC__, donc tester aussi: chaine = "_TRUC_ 111 _TRUC_ 222 _TRUC_ 333 _TRUC_ 444 _TRUC_ 555" )
Sur cette base, la coquetterie de le faire en une ligne se payerait par un double appel à split(), puisque si j'ai bien lu une réponse qui m' a été faite sur ce forum il ne faut pas espérer d'optimisation. En deux lignes:
s = ch.split('zorglub') result = ''.join([a[0] + a[1] for a in zip(s, seq)] + [s[-1]])
avait été proposé dans la première réponse ;-)
-- Pierre Maurette
Bonsoir,
Bien vu Pierre, j'étais allé trop vite. Décidément, Lao-Tseu avait raison : "Méfie-toi des one-liners !". Et même des two-liners d'ailleurs, puisque ça marche mieux avec zip(s[:-1],seq)
A part ça, j'ai mesuré les temps de calcul, ça a l'air nettement plus rapide avec cette version qu'avec les expressions régulières