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



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

matchメソッドとは

Pythonで、文頭にある特定のパターンを検索・抽出したいときmatchメソッドを使用します。matchメソッドは正規表現モジュールreの中に含まれており、以下のように呼び出すことが出来ます。

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

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

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

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

matchメソッドの使い方

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

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

import re
str='abcde'
match_obj1=re.match('bcd',str)
match_obj2=re.match('abc',str)
#存在するとき
if match_obj1:
    print(match_obj1)
#存在しないとき
else :
    print(match_obj1)
#存在するとき
if match_obj2:
    print(match_obj2)
#存在しないとき
else :
    print(match_obj2)

実行結果    

None
<re.Match object; span=(0, 3), match='abc'>

文字列の先頭に含まれる場合のみ,マッチオブジェクトが生成されるので注意してください.

マッチした文字列の表示

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

import re
str='abcde'
match=re.search('abc',str)
print(match.group())

実行結果

abc

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

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

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

実行結果

0
3
(0,3)

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

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

が等価な表現となります。タプルについてもっと詳しく知りたい方は「Pythonでのtupleの使い方(Python3)」をご覧ください。

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

コード例

実際にmatchメソッドを用いて、段落の最初に全角スペースが入っているかを判断し、入っていない場合は文頭に全角スペースを追加して出力してみます。

import re
str1='' Code-Databaseではプログラミングに関する情報を随時更新しています。''
str2=''Code-Databaseではプログラミングに関する情報を随時更新しています'。'
match1=re.search(" ",str1)
match2=re.search(" ",str2)
#存在するとき(=文頭に全角スペースがあるとき)
if match1:
    #そのまま表示
    print(str1)
else :
    #全角スペースを追加して表示
    print(" "+str1)
if match2:
    #そのまま表示
    print(str2)
else :
    #全角スペースを追加して表示
    print(" "+str2)

実行結果

 Code-Databaseではプログラミングに関する情報を随時更新しています。
 Code-Databaseではプログラミングに関する情報を随時更新しています。

コードの説明

まず,モジュールをインポートして、文字列を変数に代入します.

import re
str1=' Code-Databaseではプログラミングに関する情報を随時更新しています。'
str2='Code-Databaseではプログラミングに関する情報を随時更新しています。'

全角スペースを含むかどうかを判断し、match1、match2にマッチオブジェクトもしくはNoneが格納されます。

match1=re.search(" ",str1)
match2=re.search(" ",str2)

マッチオブジェクトが存在する、つまり全角スペースが文頭に存在するときはそのまま出力します。

マッチオブジェクトが存在しない、つまり全角スペースが文頭に存在しないとき全角スペースを先頭に付与して出力します。

文字列の演算については別の記事で紹介する予定です。

#存在するとき(=文頭に全角スペースがあるとき)
if match1:
    #そのまま表示
    print(str1)
else :
    #全角スペースを追加して表示
    print(" "+str1)
if match2:
    #そのまま表示
    print(str2)
else :
    #全角スペースを追加して表示
    print(" "+str2)

この記事のまとめ

本記事ではPythonでの文字列検索matchメソッドを、具体例を基に説明しました。最後に記事の要点をまとめます。

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

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