On Wed, 31 Dec 2008 15:40:32 +0100, TP wrote: > Hi everybody, > > I would like to change only the nth occurence of a pattern in a string. > The problem with "replace" method of strings, and "re.sub" is that we > can only define the number of occurrences to change from the first one. > >>>> v="coucou" >>>> v.replace("o","i",2) > 'ciuciu' >>>> import re >>>> re.sub( "o", "i", v,2) > 'ciuciu' >>>> re.sub( "o", "i", v,1) > 'ciucou' > > What is the best way to change only the nth occurence (occurrence number > n)?
Step 1: Find the nth occurrence. Step 2: Change it. def findnth(source, target, n): num = 0 start = -1 while num < n: start = source.find(target, start+1) if start == -1: return -1 num += 1 return start def replacenth(source, old, new, n): p = findnth(source, old, n) if n == -1: return source return source[:p] + new + source[p+len(old):] And in use: >>> replacenth("abcabcabcabcabc", "abc", "WXYZ", 3) 'abcabcWXYZabcabc' > Why this default behavior? For the user, it would be easier to put > re.sub or replace in a loop to change the first n occurences. Easier than just calling a function? I don't think so. I've never needed to replace only the nth occurrence of a string, and I guess the Python Development team never did either. Or they thought that the above two functions were so trivial that anyone could write them. -- Steven -- http://mail.python.org/mailman/listinfo/python-list