【Python】文字列の検索find・rfindメソッド

2023年1月8日

Pythonにおける文字列の検索のfindとrfindメソッドについて紹介します。

文字列検索findの使い方

文字列の中に別の文字列が含まれているかどうかの判定はin演算子とnot in演算子で調べられます。

# 文字列に含まれる文字列を探索(in演算子)

txt = 'XABCDEFGHI'
ptn = 'ABC'

if ptn in txt:
  print('ptnはtxtに含まれています。')
else:
  print('ptnはtxtに含まれていません。')
ptnはtxtに含まれています。

ただしin演算子では含まれるかどうかがわかっても含まれる位置はわかりません。

含まれる位置を調べられるのがfindメソッドです。

str.find(sub[, start[, end]])

findメソッドでは文字列str内に第一引数の文字列subが含まれているかどうかが調べられます。

含まれていればその最小のインデックスを返却し、見つからなければ-1を返却します。

コード例

# 文字列に含まれる文字列を探索(findメソッド)

txt  = 'XABCDEFGHI'
ptn1 = 'ABC'
ptn2 = 'XYZ'

print(f'ptn1が含まれるのはtxt[{txt.find(ptn1)}]です。')
print(f'ptn2が含まれるのはtxt[{txt.find(ptn2)}]です。')

実行結果

ptn1が含まれるのはtxt[1]です。
ptn2が含まれるのはtxt[-1]です。

findメソッドで複数の該当文字列がある場合

探索する文字列の中に検索したい文字列が複数含まれている場合は最初に見つけた場所、つまり最小のインデックス値を返します。

コード例

# 文字列に含まれる文字列を探索(該当文字列が複数)

txt = 'XABCYABCZABC'
ptn = 'ABC'

print(f'ptnが含まれるのはtxt[{txt.find(ptn)}]です。')

実行結果

ptnが含まれるのはtxt[1]です。

探したい文字列が複数ある場合で今回の場合だと真ん中にあるtxt[5]の’ABC’を検索したい場合は開始位置を指定します。

省略可能な第2引数のstartに検索を開始させたいインデックス値を指定するとそこから検索が始まります。

また省略可能な第3引数のendに指定されたインデックス値の直前の要素で検索が終了します。

コード例

# 文字列に含まれる文字列をfindで探索(startとendを指定)

txt = 'XABCYABCZABC'
ptn = 'ABC'

print(f'ptnが含まれるのはtxt[{txt.find(ptn, 4)}]です。')
print(f'ptnが含まれるのはtxt[{txt.find(ptn, 8)}]です。')
print(f'ptnが含まれるのはtxt[{txt.find(ptn, 4, 8)}]です。')
print(f'ptnが含まれるのはtxt[{txt.find(ptn, 4, 7)}]です。') # -1

実行結果

ptnが含まれるのはtxt[5]です。
ptnが含まれるのはtxt[9]です。
ptnが含まれるのはtxt[5]です。
ptnが含まれるのはtxt[-1]です。

startの値は0から始まるのは文字列のインデックス通りなので分かるとは思います。

endの値はインデックスiではなくi + 1を入力しなくてはなりません。

なぜなら検索されるのはendのインデックス値の直前の要素までだからです。

なのでtxt[5]からtxt[7]の’ABC’を検索したいときは3文目のようにendに8を指定しなくてはなりません。

7を指定した4文目ではtxt[6]までしか検索されず’ABC’が見つからない('AB’までしか検索されない)と判断され-1が返却されています。

省略可能な引数startとendはスライス式[start:end]と同様の指定です。

文字列検索rfindの使い方

findメソッドは文字列の先頭から検索しますがその逆の末尾から検索するのがrfindメソッドです。

str.rfind(sub[, start[, end]])

rfindメソッドの使い方はfindメソッドと全く同じです。

末尾から検索を始めて指定した文字列が含まれていれば最初に見つけたインデックス値を返却し、見つからなければ-1を返却します。

コード例

# 文字列に含まれる文字列を探索(rfindメソッド)

txt  = 'XABCYABCZABC'
ptn1 = 'ABC'
ptn2 = 'DEF'

print(f'ptn1が含まれるのはtxt[{txt.rfind(ptn1)}]です。')
print(f'ptn2が含まれるのはtxt[{txt.rfind(ptn2)}]です。')

実行結果

ptn1が含まれるのはtxt[9]です。
ptn2が含まれるのはtxt[-1]です。

末尾から検索して最初に該当する文字列のインデックス値を返却します。

省略可能な第2引数と第3引数のstartとendの指定方法もfindメソッドと全く同じです。

コード例

# 文字列に含まれる文字列をrfindで探索(startとend指定)

txt = 'XABCYABCZABC'
ptn = 'ABC'

print(f'ptnが含まれるのはtxt[{txt.rfind(ptn, 4)}]です。')
print(f'ptnが含まれるのはtxt[{txt.rfind(ptn, 4, 8)}]です。')
print(f'ptnが含まれるのはtxt[{txt.rfind(ptn, 0, 4)}]です。')

実行結果

ptnが含まれるのはtxt[9]です。
ptnが含まれるのはtxt[5]です。
ptnが含まれるのはtxt[1]です。

末尾から検索しますがだからと言ってstartとendの指定を逆にする必要はありません。

もちろんfindメソッドと同じくendは検索する直前のインデックス値であることに注意します。

list型のリストにはfindではなくindexメソッド

list型のリストの中にある特定の要素を探したいときはfindメソッドではなくindexメソッドを使います。

なぜならfindメソッドは文字列のメソッドなのでリストには適応できません。

list型にはin演算子、not in演算子や出現回数をカウントするcountメソッドも使えます。

コード例

# リストに含まれる要素を探索(in演算子、index、countメソッド)

lst = [1, 2, 3, 4, 2, 5]

print(2 in lst) # in演算子
print(f'2が含まれるのはlst[{lst.index(2)}]です。') # indexメソッド
print(f'2は{lst.count(2)}個含まれます。') # countメソッド

実行結果

True
2が含まれるのはlst[1]です。
2は2個含まれます。

Python

Posted by ほりえりお