The non-recursive version can be done as easily with
find as with
rfind, so I've shown both. My recursive version uses
rfind. If someone has a recursive version that uses
find, I'd be curious to see it. I have a theory about why I found
rfind necessary to work the recursive version, but it could be way off base; I'd like to find out.
PS 3: Problem 2 » Solutions
# Problem 2: subStringMatchExact (uses find), subStringMatchExact2 (uses rfind), # subStringMatchExactR (recursivem uses rfind) def subStringMatchExact( target, key ): if key: offsets = () offset = target.find( key ) while offset != -1: offsets += offset, offset = target.find( key, offset+1 ) else: # A little something he didn't mention: In Problem 3, if the key # is a single letter and key1 or key2 is empty, n+m+1 overrun the last # index and won't return it, even though the last index is an # acceptable value. Therefore, we have to add an extra index when key # is empty. INELEGANT! offsets = range(0, len(target)+1 ) return offsets def subStringMatchExact2( target, key ): if key: offsets = () while target.rfind( key ) != -1: offsets += (target.rfind( key ),) target = target[:target.rfind( key )] else: offsets = range(0, len(target) ) return offsets def subStringMatchExactR( target, key ): if key: if target.rfind(key) == -1: return () else: offset = target.find(key) + 1 return (target.rfind(key),) + subStringMatchExactR(target[:target.rfind(key)],key) else: return range(0, len(target)+1 )