find(str、文字列)
このページでは豊富な例を用いてPythonのstrクラス(文字列)のfindの使い方を学ぶことができます。
findはstrクラス(文字列)のメソッドの1つです。
引数で指定した文字列を呼び出し元の文字列に対して検索し、検索文字列が含まれる場合はそのインデックスを戻り値(返り値)として返します。
呼び出し元の文字列に検索する文字列が複数含まれる場合は、最も値の低いインデックスが返ります。
また、第2・第3引数を指定することで検索範囲を指定することもできます。
TL;DR
基本
# 引数に検索したい文字列を指定する
string1 = 'ABCDE'
index1 = string1.find('C')
# 文字列のインデックスがint型で返ってくる
print(index1)
==> 2
print(type(index1))
==> <class 'int'>
# 同じインデックスで検索文字が返ってくるかの確認
print(string1[2])
==> C
string2 = 'apple,banana,kiwi'
print(string2.find('banana'))
==> 6
# 検索文字が複数ある場合は最も値が低いインデックスを得る
string3 = '1234567890123'
print(string3.find('3'))
==> 2
# 空文字('')を検索文字列に指定した場合
print('some string'.find(''))
==> 0
# 検索する文字列が含まれていない場合は-1が戻り値
string4 = 'I have a pen.'
print(string4.find('apple'))
==> -1
# 大文字・小文字を区別する
print('ABCDE'.find('cd'))
==> -1
# 大文字・小文字を意識しない検索を行いたい場合
string5 = 'ABCDE'
# 検索対象のケース(今回は小文字)に合わせて文字列をlowerで小文字化
print(string5.lower().find('cd'))
==> 2
# if文との組み合わせ
string6 = 'I love Python.'
if string6.find('JavaScript') != -1:
print('Match!')
else:
print('Not Match...')
==> Not Match...
# for文との組み合わせ
list1 = ['python', 'javascript', 'golang', 'kotlin', 'smalltalk']
filtered_list1 = []
for element in list1:
if element.find('a') != -1:
filtered_list1.append(element)
print(filtered_list1)
==> ['javascript', 'golang', 'smalltalk']
# filterを使用した表現
list1 = ['python', 'javascript', 'golang', 'kotlin', 'smalltalk']
# filter関数を使用して、条件にあう要素を生成するfilterオブジェクトを得てからリスト化
filter1 = filter(lambda e: e.find('a') != -1, list1)
filtered_list2 = list(filter1)
print(filtered_list2)
==> ['javascript', 'golang', 'smalltalk']
関連情報:type(組み込み関数)の使用方法
関連情報:forの使用方法
関連情報:lambda(ラムダ式)の使用方法
関連情報:filter関数の使用方法
文字列を検索する範囲の指定
# 第2引数を与えて検索範囲を指定する
string1 = 'I have a pen.'
index1 = string1.find('a', 4)
print(index1)
==> 7
# 以下のスライス表記の範囲で検索する指定になる(インデックスは元の文字列のもの)
print(string1[4:])
==> ve a pen.
# 第2引数と第3引数を与えて検索範囲を指定する
string2 = 'I have a pen.'
index2 = string2.find('pen', 4, 11)
print(index2)
==> -1
# 以下のスライス表記の範囲で検索する指定になる
print(string2[4:11])
==> ve a pe
最も大きいインデックスを返すrfindメソッド
# findは検索文字が複数ある場合は最も値が低いインデックスを得る
string1 = '12345,12345'
index1 = string1.find('1')
print(index1)
==> 0
# rfindは最も大きい値のインデックスを返す
r_index1 = string1.rfind('1')
print(r_index1)
==> 6
# findと同様に第2、第3引数を同じ用途で使用することができる
string2 = 'pen,pineapple,apple,pen'
r_index2 = string2.rfind('apple', 5, 20)
print(r_index2)
==> 14
print(string2[5:20])
==> ineapple,apple,
解説
基本
findは引数として指定した文字列が呼び出し元の文字列に含まれているかを調べ、見つかった場合はそのインデックスをint型(整数)で返します。
指定した検索文字列が見つからない場合は-1
を戻り値(返り値)として返します。
また、検索する文字列が重複して対象に含まれている場合は最も値の小さいインデックス値を返します。
string1 = 'Python'
index1 = string1.find('th')
# 文字列のインデックスがint型で返ってくる
print(index1)
==> 2
print(type(index1))
==> <class 'int'>
# 検索文字が複数ある場合は最も値が低いインデックスを得る
string2 = 'I have a pen.'
# 最初にマッチする'a'のインデックスを得る
print(string2.find('a'))
==> 3
# 検索する文字列が含まれていない場合は-1が戻り値
print('pen,pineapple'.find('apple,pen'))
==> -1
# 大文字・小文字を区別する
string3 = 'FooBarNinja'
print(string3.find('foobar'))
==> -1
関連情報:type(組み込み関数)の使用方法
文字列を検索する範囲の指定
findは任意指定の第2・第3引数(int型)を与えることで、呼び出し元の文字列のどの範囲を検索するかを指定することができます。
検索範囲はスライス表記でS[第2引数:第3引数]
と指定した場合と同様の範囲を検索しますが、
戻り値のインデックスは検索範囲内でのインデックスではなく、元の文字列におけるインデックスを返すことに気をつけてください。
string1 = 'ABCDEFG'
index1 = string1.find('DE', 2)
print(index1)
==> 3
# 以下のスライス表記の範囲で検索する指定になる(インデックスは元の文字列のもの)
print(string1[2:])
==> CDEFG
string2 = 'ABCDEFG'
print(string2.find('DE', 2, 4))
==> -1
# 以下のスライス表記の範囲で検索する指定になる
print(string1[2:4])
==> CD
最も大きいインデックスを返すrfindメソッド
findメソッドは最も値の小さいインデックスを返しますが、
同じstrクラスのrfind
メソッドは最も大きい値のインデックスを返します。
つまり、文字列の最後尾から検索して最初にマッチする文字列のインデックスを返します。
string1 = 'ABCABC'
index1 = string1.find('A')
r_index1 = string1.rfind('A')
print(index1)
==> 0
print(r_index1)
==> 3
string2 = 'python,javascript'
print(string2.rfind('a', 5, 15))
==> 10
print(string2[5:15])
==> n,javascri