Pythonの文字列の検索方法|find, in, count, re.search

Pythonで文字列を検索する方法はいくつかあります。

findメソッドは、指定した文字のインデックス位置を調べます。in文は指定した文字が存在するかどうかを調べます。countメソッドは、指定した文字の個数を調べます。

それぞれ覚えておくと便利なので、しっかりと抑えていきましょう!

目次

1. Pythonで文字列の位置を検索する

Pythonで文字列の中の指定の文字を検索して、その位置を知りたい時にまず使うのはfindメソッドです。

1.1. findメソッド

Pythonで文字列の位置を検索するには、文字列メソッドのfindを使います。このメソッドは指定した文字が見つかった最初の位置を返します。見つからなかった場合は -1 を返します。

以下が基本書式です。

In [1]:
検索対象の文字列(変数).find(検索したい文字列, 開始位置, 終了位置)

それでは見てみましょう。

以下の文字列の中で「アップルパイ」を検索すると3と表示されます。

In [2]:
text = "これはアップルパイです。"
text.find("アップルパイ")
Out[2]:
3

この文字列の中の各文字は、それぞれ次のようにインデックス番号が割り振られています。

findメソッドは、検索した文字列の最初の位置を返します。上の例では、「アップルパイ」という文字列の最初の文字「ア」のインデックス番号は3なので、その番号が返されているのです。

次のように該当する文字が複数ある場合は、最初に見つかった位置を返します。

In [3]:
text = "apple pieがすき"
text.find("e")
Out[3]:
4

この文字列は次のようにインデックスされています。

「apple pieがすき」の文字列の中には e が2つありますが、最初の e の位置を返していますね。

次のように開始位置と終了位置を指定すると、その中で検索してくれます。

In [4]:
text = "apple pieがすき"
text.find("e", 6, 10)
Out[4]:
8

これはインデックス番号6番以上9番以下の中に e があるかどうかを検索しています。8番目にあるので、8と返されていますね。

findメソッドは検索した文字が存在しない場合は、次のように -1 が返されます。

In [1]:
text = "apple pieがすき"
text.find("banana")
Out[1]:
-1

1.2. rfindメソッド

rfindメソッドはfindメソッドと反対に指定の文字列を後ろから検索します。書き方はfindメソッドと同じです。

In [1]:
検索対象の文字列(変数).rfind(検索したい文字列, 開始位置, 終了位置)

まずは次の例をご覧ください。

In [1]:
text = "アップルパイもレモンパイもおいしい。"
text.rfind("パイ")
Out[1]:
10

この文字列は次のようにインデックスされています。

rfindメソッドでは、後ろの「パイ」の開始位置のインデックス番号を返していることがわかりますね。このようにrfindメソッドは、指定の文字を後ろから検索してくれます。これ以外の点は、findメソッドと全く同じです。

なおfindメソッドとrfindメソッドについては、『Pythonのfindの使い方と注意点』でより詳しく解説していますので、ぜひご確認ください。

2. Pythonで文字列の存在を検索する

findメソッドは検索したい文字のインデックス番号を返してくれるものでした。ここでは、文字列の中に指定した文字が存在するかどうかを確認する方法を解説します。findメソッドと組み合わせると、様々な状況に対応できるようになるでしょう。

2.1. in文

in文を次のように使うと、検索したい文字が文字列の中にあるかどうかが分かります。

In [ ]:
検索したい文字 in 文字列

次のコードを見てみましょう。

In [2]:
text = 'Bohemian Rapsody'
'Bohemian' in text
Out[2]:
True

このように検索したい文字が存在する場合はTrueを返します。次に、検索したい文字が存在しない場合を見てみましょう。

In [3]:
text = 'Bohemian Rapsody'
'apple' in text
Out[3]:
False

このように存在しない場合はFalseを返します。

2.2. countメソッド

countメソッドは指定の文字が文字列の中にいくつあるかを返してくれるものです。次のように書きます。

In [ ]:
検索対象の文字列変数.count(検索したい文字, 開始位置, 終了位置)

それでは使ってみましょう。次の文字列の中に’p’はいくつあるでしょうか。

In [1]:
text = 'peter piper picked a peck of pickled peppers.'
text.count('p')
Out[1]:
9

9個ですね。それでは’z’はいくつあるでしょうか。

In [2]:
text.count('z')
Out[2]:
0

0個ですね。もちろん、単語を検索することもできます。次の文字列の中に’pen’はいくつあるでしょうか。

In [3]:
text = 'pen pineapple apple pen'
text.count('pen')
Out[3]:
2

2個ですね。

Pythonのcountメソッドでlistや文字列を検索する方法』でより詳しく解説しているので、ぜひご覧ください。

3. Pythonで文字列を検索する時の注意点

文字列を検索する時は一点注意したいことがあります。次の文字列を例に解説します。

In [1]:
text = 'pen pineapple apple pen'
print(text)
pen pineapple apple pen

この文字列で、それぞれの文字は次のようにインデックスされています。

これにfindメソッドを使って、’apple’を検索してみましょう。

In [2]:
text.find('apple')
Out[2]:
8

appleの最初の文字のインデックス番号は14番ですね。それにも関わらず、findメソッドは8と返しています。見てみると、pineappleの中に確かにappleという文字がありますね。

Pythonは、文字を単語で捉えているのではなく、単なる文字の並び(=シーケンス)として認識しています。そのため、’pineapple’という単語の中の’apple’という文字の並びも検出するようになっています。

countメソッドでも同様に、’pineapple’の’apple’を検出します。

In [3]:
text.count('apple')
Out[3]:
2

Pythonで文字列を検索する時は、この注意点を頭に入れておきましょう。

4. 【中級以上】正規表現を使った検索 | re.search関数

Pythonの文字列の検索は、ここまで見てきたようなメソッドを使うのがシンプルです。ただし、もっと高度な検索を行いたい時は正規表現を使う方法があります。

正規表現は、プログラミング初学者の段階では分からなくても全く問題ありませんので、ここでは流し読みでも構いません。コードを書くことを続けていれば、後になって読み返した時にすんなりと理解できるようになります。

正規表現とは
正規表現とは、簡単に言うと「様々な文字列を1つの文字列で表現する方法」です。現段階では、あくまでもオプションですが、気になる方は、Qiitaさんの「正規表現とは」で非常に分かりやすく解説されているため、目を通して見てください。

re.search関数の基本構文

search関数の基本構文は次の通りです。

import re
re.search(正規表現, 検索対象の文字列(変数))

seach 関数は re モジュールの関数なので、最初に “import re” でモジュールを読み込んでおく必要があります。モジュールについては「Pythonのモジュール」でご確認ください。

第一引数に、比較したい文字列を正規表現パターンで入力します。第二引数に検索対象の文字列(変数)を入力します。正規表現のパターンは「正規表現一覧」と「サルにもわかる正規表現」で、ほぼ一通り、確認することができます。

それでは、次の文字列を、正規表現で検索してみましょう。

In [1]:
text = "123abc456def789"
In [2]:
import re
re.search(r"[a-z]+", text)
Out[2]:
<_sre.SRE_Match object; span=(3, 6), match='abc'>

検索結果はこのように返されます。「span」は対象となる文字のインデックス位置を示す番号を、「match」は見つかった文字列を返します。

re.search関数は正規表現を使って検索できるため、メソッドよりも遥かに複雑な検索を行うことができるようになります。そのためには、正規表現の理解が必須なので、しっかり学習したいですね。

注:re.search関数とre.match関数の違い
Pythonの文字列の比較」では、同じ re モジュールのmatch関数について解説しています。match関数とsearch関数は似ていますが、前者は、文字列の先頭にマッチするパターンがあるかどうかを判定します。後者は、文字列全体からマッチするパターンがあるかどうかを判定します。

マッチオブジェクト(group, start, end, span)

次のようにマッチオブジェクトを使うと、それぞれ見たい対象ごとに抜け出してくれます。

In [5]:
search = re.search(r"[a-z]+", text)
print(search.group())
print(search.start())
print(search.end())
print(search.span())
Out [3]
abc
3
6
(3, 6)

ご覧のように、 group は対象となる文字列を、 start はその文字列の開始場所のインデックス番号を、 end はその文字列の終了位置のインデックス番号を、 span はその文字列の開始位置と終了位置のインデックス番号を返します。

引数を入力すると、何番目に一致した文字列を返すかを指定できます。例えば、

  • group(0):デフォルト値。検索に一致した文字列を返す。
  • group(1):最初に一致した文字を返す。
  • group(2):2番目に一致した文字を返す。

というようになっています。

マッチオブジェクトを使うと、これらのように、マッチした結果に対して何らかの処理や判定を組み込めるようになります。こうした観点から、正規表現を使うと、より高度な検索や処理ができるようになるので、ぜひチャレンジしてみてください。

5. まとめ

Pythonの文字列の検索にはいくつかの方法があります。

findメソッドは検索したい文字のインデックス番号を返します。countメソッドは検索したい文字の個数を返します。in文は検索したい文字が存在するかどうかをブール値(True or False)で返します。

findメソッドやcountメソッドを使う時は、これらのメソッドは完全一致の単語ではなく、検索したい文字の並びと同一のものを検出するという注意点を覚えておきましょう。

また、正規表現を使う re.search 関数は、初心者の段階では、理解できなくても全く問題ありません。不思議なもので、プログラミングは、自分でコードを書いていれば、後になって、すんなりと理解できるようになっているものです。

そのため、初心者の方は、まず、それぞれのメソッドをしっかりと使いこなせるようになることから始めましょう。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる