Pythonのfindメソッドの使い方と注意点まとめ

Pythonのfindメソッドは文字列の中に、指定の文字列が存在するかどうか、あるとしたらその位置はどこかを教えてくれるメソッドです。とてもよく使うものなので、ここでしっかり使い方と注意点を学習しておきましょう。

目次

1. Pythonのfindメソッドの使い方

Pythonのfindメソッドの書き方は次の通りです。

In [ ]:
''' findメソッドの書き方'''
文字列.find(探したい文字列, 開始位置, 終了位置)

findメソッドは文字列メソッドなので、先頭に文字列を書きます。そしてfind()の括弧の中に引数として探したい文字列を指定します。開始位置と終了位置はオプション引数で、必ず設定しなければならないというものではありません。

それでは、実際に使いながら確認していきましょう。

1.1. Pythonのfindで文字列の存在と位置を確認する

早速、次のコードをご覧ください。’これは文字列です。’という文字列の中に’文’という文字、そして’学’という文字が存在するかどうかをfindメソッドで調べています。

In [1]:
''' findメソッドの使い方 '''
print( 'これは文字列です。'.find('文'))  #  該当する文字のインデックス番号を返す。
print( 'これは文字列です。'.find('学'))  #  該当する文字がない場合-1を返す。
3
-1

ご覧のように指定の文字が存在する場合、findメソッドは、その文字の位置をインデックス番号で返します。’これは文字列です。’という文字列のそれぞれの要素のインデックス番号は以下の通りです。

インデックス番号は前から数える場合は0から始まります。後ろから数える場合は-1から始まります。初心者の間はうっかり忘れがちなので覚えておきましょう。

これを見ると’文’という文字はインデックス番号の3番の位置にありますね。そのため上記コードではfindメソッドは3を返しています。

なお指定の文字が存在しない場合は、findメソッドは-1を返します。’これは文字列です。’という文字列の中に、’学’という文字はありません。そのため、上記コードではfindメソッドは-1を返しています。

もし、単語を探したい場合はfindメソッドは、その単語の最初の文字のインデックス番号を返します。以下をご覧ください。

In [2]:
''' 単語を探す場合は、その単語が始まる位置を返します。 '''
text = "これはアップルパイです。"
text.find("アップルパイ")
Out[2]:
3

この文字列の中で’アップルパイ’はインデックス番号3番から始まっていますね。そのためfindメソッドは3を返しています。

1.2. Pythonのfindで複数の該当する文字がある場合

もし、ある文字列の中に探したい文字列に該当する文字が複数ある場合、findメソッドは最初に見つかったものの位置を返します。

次のコードをご覧ください。

In [3]:
''' 該当する文字が複数ある場合は、最初に見つかった位置を返します。 '''
text = "apple pieがすき"
text.find('e')
Out[3]:
4

‘apple pieがすき’という文字列の中には’e’という文字は、インデックス番号4番と8番の位置に2つあります。findメソッドは最初の’e’の位置だけ返すので、4を返しています。

もし、インデックス番号4番以降にも、指定の文字列’e’が存在するかを知りたい場合は、オプション引数で開始位置と終了位置を指定することで、それが可能になります。

次のコードをご覧ください。

In [4]:
''' オプション引数で開始位置と終了位置を指定して検索'''
text = "apple pieがすき"
print(text.find('e', 6, 10))  #  前から数えたインデックス番号で開始位置と終了位置を指定
print(text.find('e', -6, -2))  #  後ろから数えたインデックス番号で開始位置と終了位置を指定
print(text.find('e', 6, -2))  #  開始位置を前からの終了位置を後ろからのインデックス番号で指定
8
8
8

こうやって書くことでfindメソッドは開始位置6から終了位置10の間で、指定の文字列’e’が存在するかどうかを調べてくれます。

インデックス番号6から10の間では、インデックス番号8番の位置に指定の文字列’e’があるので、findメソッドは8と返しています。なお、上のコード中に書いている通り、開始位置と終了位置の指定は、前から数えたインデックス番号も後ろから数えたインデックス番号もどちらででも可能です。

このfindメソッドを使いこなせるようになると、例えば、ある文字列の中に指定の文字列が存在する場合は処理Aを、存在しない場合は処理Bをするというようなプログラムを書くことができます。

以下のコードは、非常に簡単でシンプルな例です。

In [5]:
''' このようなプログラムを書くのに使われます。 '''
 
#  文字列を作ります。
quote = 'Let it be, let it be, let it be'
 
#  if文で条件分岐を作ります。
if (quote.find('be,') != -1):
    print("この文字列には'be,'という文字が含まれています。")
else:
    print("この文字列には'be,'という文字は含まれていません。")
この文字列には'be,'という文字が含まれています。

2. Pythonのrfindメソッドの使い方

findメソッドと一緒に抑えておきたいものにrfindメソッドというものがあります。rfindメソッドはfindメソッドと書き方はまったく同じですが、探したい文字を後ろから探していくという点が異なります。

次のコードをご覧ください。

In [1]:
''' rfindメソッド '''
text = "apple pieがすき"
print(text.find('e'))  #  該当する文字があるどうかを前から探します。
print(text.rfind('e'))  #  該当する文字があるかどうかを後ろから探します。
4
8

findメソッドは4をrfindメソッドは8を返していますね。

これは下図のようにrfindメソッドは指定の文字を、文字列の後ろから探すからです。

これ以外はfindメソッドと全く同じです。以下にいくつかコードを書いておきます。

In [1]:
''' rfindメソッドについて一通り見ておきましょう。  '''
text = "apple pieがすき"
print(text.rfind('f'))  #  該当する文字がない場合は-1を返す。
print(text.rfind('e', 1, 5))  #  インデックス番号1から5の間で'e'を探す。
print(text.rfind('e', -11, -7))  #   インデックス番号-11から-7の間で'e'を探す。
print(text.rfind('e', 1, -7))  #   インデックス番号1から-7の間で'e'を探す。
-1
4
4
4

注意点として、rfindは後ろから指定の文字列を探すといっても開始位置を後ろに終了位置を前にする必要はありません。開始位置と終了位置の指定のしかたはfindメソッドと全く同じです。

3. Pythonのlistにはfindメソッドではなくindexメソッド

たまにリストの中に任意の要素があるかどうかをfindメソッドで調べられないかと聞かれることがあります。findメソッドはあくまでも文字列メソッドなので文字列に対して使います。

リストの要素を調べるには、in文やindexメソッド、countメソッドを使います。文字列のfindメソッドと似ているのはindexメソッドです。以下のコードをご覧ください。

In [1]:
numbers = [1, 5, 5, 10, 10, 10, 15, 15, 15,  20]
print(5 in numbers)  #  in文
print(numbers.index(5))  #  indexメソッド
print(numbers.count(5))  #  count メソッド
True
1
2

これらは『Pythonのリストを検索する方法まとめ』で解説していますので、ぜひご確認ください。

4. findメソッドのまとめと文字列を検索するその他の方法

さて、見てきたようにfindメソッドは、ある文字列の中に指定の文字列が存在するかどうかを確認するメソッドです。もし、該当する文字が複数存在する場合、findメソッドは、一番最初に見つかったものの位置を返します。

開始位置と終了位置を指定すると、検索する範囲を限定することができますので、うまく使いこなしましょう。

またfindメソッドと一緒にrfindメソッドも覚えておきましょう。rfindメソッドは文字列の後ろから探していく点以外はfindメソッドと全く同じです。

なお、文字列の中の任意の文字の存在を確認する方法は、他にも、countメソッドを使う方法や、より詳細な条件で検索したい場合は、reモジュールのsub関数を使う方法もあります。

Pythonの文字列の検索で知っておくべき方法まとめ』でまとめていますので、ぜひ併せてご覧ください。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる