文字列のスライスとfind/rfindで検索範囲の指定が違っていて混乱したので整理する。
文字列のスライスでは、次のように指定する。
1 |
string[start:end:step] |
このとき、stepが正なら前方から後方へ、負なら後方から前方へ向かって文字列が取り出されるが、そのときのstartとendの指定は、stepが正か負かで次のように違ってくる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
s = "0123456789" print(s[3:7:1]) print(s[-7:-3:1]) # どちらも"3456" # start:stopでstart<stop print(s[7:3:1]) print(s[-3:-7:1]) # どちらも"" # start:stopでstart>stop print(s[3:7:-1]) print(s[-7:-3:-1]) # どちらも"" # start:stopでstart<stop print(s[7:3:-1]) print(s[-3:-7:-1]) # どちらも"7654" # start:stopでstart>stop |
つまりstepが正の時は、前方から後方へ文字列が取り出されるのでstart<stop、stepが負の時は逆にstart>stopでなければならない。
一方、find/rfindについてはスライスと違ってくる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
s = "abcdeabcde" print(s.find('b',4, 8)) print(s.find('b',-6, -2)) # どちらも6 # start,stopでstart<stop print(s.find('b',8, 4)) print(s.find('b',-2, -6)) # どちらも-1 # start,stopでstart>stop print(s.find('b',4, 8)) print(s.find('b', -6, -2)) # どちらも6 # start,stopでstart<stop print(s.rfind('b',8, 4)) print(s.rfind('b',-2, -6)) # どちらも-1 # start,stopでstart>stop |
(string, start, stop)の指定で、検索範囲の指定は常にstart < stopでなければならない。