format_list_bulleted
【Python】文字列を検索する方法(search)について(Python3)
最終更新日時:2020-05-03 12:48:26



Python(Python3)で文字列処理をする時に、特定の文字列を検索したいというような場合があると思います。そのような場合にPythonでは文字列を検索するためのsearchメソッドが用意されています。他にもPythonでは文字列を検索できるmatchメソッドやfindallメソッドがあります。ですが、文字列の最初の部分以外でもマッチする・マッチした最初の1回のみ返すという点で他の2つのメソッドとは異なる特徴があります。ほかの検索メソッドとの違いについては、「Pythonで文字列を検索する方法まとめ」で確認してみてください。今回はsearchメソッドの使い方について紹介します。

searchメソッドとは

 Python3で特定の文字列を検索・抽出したいときsearchメソッドを使用します。searchメソッドは、検索する文字列の中でパターンにマッチした最初の1回を返します.メソッドは正規表現モジュールreの中に含まれており、次のように呼び出すことが出来ます。

import re
re.search(検索したいパターン,検索する文字列)

 第一引数として検索したいパターンを、第二引数として検索する文字列を指定します。検索する文字列の中に条件に一致した文字列がある場合はマッチオブジェクトを、無かった場合はNoneを返します。

 第一引数には正規表現を用いることが出来ますが、今回は扱いません。また、第三引数にflagを指定することでオプションをつけることも出来ますが今回は省略します。Pythonで正規表現を扱う方法についてと検索メソッドの第3引数については別の記事で紹介しています。

Pythonの検索メソッド(match,search,findall)のflagについて

searchメソッドの使い方

マッチした文字列の存在判定 

マッチした文字列が存在するかどうかはif文で判定できます。

import re
str='abcde'
match_obj=re.search('bcd',str)
#存在するとき
if match_obj:
    print('true')
#存在しないとき
else :
    print('false')

 実行結果 

true

マッチした文字列の表示 

マッチした文字列の中身を表示したいときは、groupメソッドを使用することで行えます。

import re
str='abcde'
match_obj=re.search('bcd',str)
print(match_obj.group())

 実行結果

bcd

マッチした文字列のインデックスの表示 

マッチした部分の位置はstart()、end()、span()で表示できます。

import re
str='abcde'
match_obj=re.search('bcd',str)
#マッチした部分の先頭番号を表示
print(match_obj.start())
#マッチした部分の末尾の次の番号を表示
print(match_obj.end())
#マッチした部分の先頭と末尾の次の番号のタプルを表示
print(match_obj.span())

 実行結果

1
4
(1,4)

 pythonの文字列は0番目から始まるので、「b」は1番目である点に注意してください。span()についてはtupleなので要素を取り出すことが可能です。それぞれ

match_obj.start()
match_obj.span()[0]
match_obj.end()
match_obj.span()[1]

 が等価な表現となります。tupleについてもっと詳しく知りたい方は「Pythonのtupleについて解説」をご覧ください。

searchメソッドを用いた実装例

コード例

 実際にsearchメソッドを用いて、以下の情報からcodeを検索してみます。

import re
str="""
サイト名 Code-Database
作成時期 2020年4月
"""
match_obj=re.search("Code-Database",str)
#存在するとき
if match_obj:
    #マッチした部分の文字列を表示
    print(match_obj.group())
    #マッチした部分の文字列を表示(start()とend()を使うやり方)
    print(str[match_obj.start:match_obj.end()])
    #マッチした部分の文字列を表示(span()を使うやり方)
    print(str[match_obj.span()[0]:match_obj.span()[1]])

 実行結果

Code-Database
Code-Database
Code-Database

 コードの説明

 以下の情報をstrとして宣言します。

"""
サイト名Code-Database
作成時期 2020年4月
"""

 その後、変数matchをマッチオブジェクトとして宣言します。

match_obj=re.search("Code-Database",str)

 マッチした部分が存在するとき、match.group()でマッチした部分を出力します。

#存在するとき
if match_obj:
  #マッチした部分の文字列を表示
  print(match_obj.group())

 次に、match.start()とmatch.end()を用いてstrの一部を出力しています。

  #マッチした部分の文字列を表示(start()とend()を使うやり方)
  print(str[match_obj.start:match_obj.end()])

 match.span()[0]がマッチ部分の先頭を、match.span()[1]が末尾を示すため、str[match.span()[0]:match.span()[1]]とmatch.span()が同じ出力となります。

  #マッチした部分の文字列を表示(span()を使うやり方)
  print(str[match_obj.span()[0]:match_obj.span()[1]])

この記事のまとめ

 本記事ではPython3での文字列検索searchメソッドを、具体例を元に説明しました。最後に記事の要点をまとめてみましょう。

  • 文字列の検索のときはsearchメソッド
  • 引数は検索したいパターンと検索する文字列
  •  返り値はマッチオブジェクト
  • group()でマッチした文字列を抽出
  • start()でマッチした先頭番号を抽出
  • end()でマッチした末尾の次の番号を抽出
  • span()でマッチした先頭番号と最終番号のタプルを抽出

Python3のsearchメソッドを是非活用してみましょう!