flexible find and replace ?

John Machin sjmachin at lexicon.net
Tue Feb 17 08:02:34 EST 2009


On Feb 17, 7:18 pm, Duncan Booth <duncan.bo... at invalid.invalid> wrote:
> John Machin <sjmac... at lexicon.net> wrote:
> > def fancyrepl(tag, replfunc, input_string):
> >     count = 0
> >     pieces = []
> >     pos = 0
> >     taglen = len(tag)
> >     while 1:
> >         try:
> >             newpos = input_string.index(tag, pos)
> >         except ValueError:
> >             pieces.append(input_string[pos:])
> >             return ''.join(pieces)
> >         pieces.append(input_string[pos:newpos])
> >         count += 1
> >         pieces.append(replfunc(count))
> >         pos = newpos + taglen
>
> Or even:
>
> import re, itertools
> def fancyrepl(tag, replfunc, input_string):
>         counter = itertools.count(1)
>         return re.sub(re.escape(tag),
>          lambda m: replfunc(counter.next()), input_string)
>
> which does exactly the same thing

Not exactly; mine needs
    taglen = max(1, len(tag))
to stop an infinite loop when len(tag) == 0.

> in rather less code.

and with rather less execution speed [measured at about half] and
rather less OP-explanation speed [guessed] :-)



More information about the Python-list mailing list