@@ -120,15 +120,17 @@ def joinfields(words, sep = ' '):
120120 return res [len (sep ):]
121121
122122# Find substring, raise exception if not found
123- def index (s , sub , i = 0 ):
124- res = find (s , sub , i )
123+ def index (s , sub , i = 0 , last = None ):
124+ if last == None : last = len (s )
125+ res = find (s , sub , i , last )
125126 if res < 0 :
126127 raise ValueError , 'substring not found in string.index'
127128 return res
128129
129130# Find last substring, raise exception if not found
130- def rindex (s , sub , i = 0 ):
131- res = rfind (s , sub , i )
131+ def rindex (s , sub , i = 0 , last = None ):
132+ if last == None : last = len (s )
133+ res = rfind (s , sub , i , last )
132134 if res < 0 :
133135 raise ValueError , 'substring not found in string.index'
134136 return res
@@ -149,20 +151,34 @@ def count(s, sub, i = 0):
149151 return r
150152
151153# Find substring, return -1 if not found
152- def find (s , sub , i = 0 ):
153- if i < 0 : i = max (0 , i + len (s ))
154+ def find (s , sub , i = 0 , last = None ):
155+ Slen = len (s ) # cache this value, for speed
156+ if last == None :
157+ last = Slen
158+ elif last < 0 :
159+ last = max (0 , last + Slen )
160+ elif last > Slen :
161+ last = Slen
162+ if i < 0 : i = max (0 , i + Slen )
154163 n = len (sub )
155- m = len ( s ) + 1 - n
164+ m = last + 1 - n
156165 while i < m :
157166 if sub == s [i :i + n ]: return i
158167 i = i + 1
159168 return - 1
160169
161170# Find last substring, return -1 if not found
162- def rfind (s , sub , i = 0 ):
163- if i < 0 : i = max (0 , i + len (s ))
171+ def rfind (s , sub , i = 0 , last = None ):
172+ Slen = len (s ) # cache this value, for speed
173+ if last == None :
174+ last = Slen
175+ elif last < 0 :
176+ last = max (0 , last + Slen )
177+ elif last > Slen :
178+ last = Slen
179+ if i < 0 : i = max (0 , i + Slen )
164180 n = len (sub )
165- m = len ( s ) + 1 - n
181+ m = last + 1 - n
166182 r = - 1
167183 while i < m :
168184 if sub == s [i :i + n ]: r = i
0 commit comments