change only the nth occurrence of a pattern in a string

Roy Smith roy at panix.com
Wed Dec 31 10:23:05 EST 2008


In article <0scs26-7a5.ln1 at rama.fbx.proxad.net>,
 TP <Tribulations at Paralleles.invalid> wrote:

> Hi everybody,
> 
> I would like to change only the nth occurence of a pattern in a string.

It's a little ugly, but the following looks like it works.  The gist is to 
split the string on your pattern, then re-join the pieces using the 
original delimiter everywhere except for the n'th splice.  Split() is a 
wonderful tool.  I'm a hard-core regex geek, but I find that most things I 
might have written a big hairy regex for are easier solved by doing split() 
and then attacking the pieces.

There may be some fencepost errors here.  I got the basics working, and 
left the details as an exercise for the reader :-)

This version assumes the pattern is a literal string.  If it's really a 
regex, you'll need to put the pattern in parens when you call split(); this 
will return the exact text matched each time as elements of the list.  And 
then your post-processing gets a little more complicated, but nothing 
that's too bad.

This does a couple of passes over the data, but at least all the operations 
are O(n), so the whole thing is O(n).


#!/usr/bin/python                                                                                

import re

v = "coucoucoucou"

pattern = "o"
n = 2
parts = re.split(pattern, v)
print parts

first = parts[:n]
last = parts[n:]
print first
print last

j1 = pattern.join(first)
j2 = pattern.join(last)
print j1
print j2
print "i".join([j1, j2])
print v



More information about the Python-list mailing list