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メソッドを是非活用してみましょう!