format_list_bulleted
【Python】文字列検索まとめ(Python3)
最終更新日時:2020-05-03 12:48:50



Python(Python3)で文字列処理をする時に、特定の文字列を検索したい、というような場合があると思います。そのような場合にPythonでは文字列を検索するためのメソッドが多数用意されています。今回は文字列検索メソッドで代表的な、matchメソッド、searchメソッド、findallメソッドの違いについて説明したいと思います。3つののメソッドについては別の記事でそれぞれ細かく書いていますので、そちらを参照してください。

検索範囲

3つのメソッドはそれぞれ検索範囲が異なります。

matchメソッド

matchメソッドは文字列の先頭がパターンとマッチしているか判断します。先頭以外の部分でマッチしたとしても無視されます。

searchメソッド

searchメソッドは文字列の一部または全部がパターンとマッチしているか判断します。複数マッチした場合は文字列の先頭から一番近い一個が結果として返され、残りは無視されます。

findallメソッド

findallメソッドは文字列の一部または全部がパターンとマッチしているか判断します。マッチした全ての要素をリストとして返します。

3つのメソッドの呼び出し方

呼び出し方については3つのメソッドで大きな違いはありません。Pythonのモジュールreをインポートし、

re.使いたいメソッド(探したいパターン,検索する文字列)

でメソッドを呼び出します。第一引数として検索したいパターンを、第二引数として検索する文字列を指定します。

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

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

3つのメソッドの使い方の例は次のとおりです。

import re
str='abcedabcde'
#matchメソッドを呼び出し
match1=re.match('bcd',str)
#searchメソッドを呼び出し
match2=re.search('bcd',str)
#findallメソッドを呼び出し
match3=re.findall('bcd',str)

3つのメソッドの返り値

検索結果が存在した場合と存在しなかった場合にそれぞれどのような値が返ってくるかを確認します。

import re
str='abcdeabcde'
match1=re.match('abc',str)
match2=re.match('bcd',str)
match3=re.search('abc',str)
match4=re.search('bcd',str)
match5=re.findall('bcd',str)
match6=re.findall('ace',str)
print(match1)
print(match2)
print(match3)
print(match4)
print(match5)
print(match6)

実行結果

<re.Match object; span=(0, 3), match='abc'>
None
<re.Match object; span=(0, 3), match='abc'>
<re.Match object; span=(1, 4), match='bcd'>
['bcd', 'bcd']
[]

matchメソッド・searchメソッドの返り値

matchメソッドとsearchメソッドでは、一致した部分が一箇所以上あった時にマッチオブジェクト、無かった時にNoneを返します。matchメソッドは文字列の先頭部分しか判断しないため注意してください。また、matchメソッドとsearchメソッドはパターンにマッチした文字列のうち最初の一個しか返さないことにも気をつけましょう。

findallメソッドの返り値

findallメソッドは一致した部分がある場合もない場合もリストを返します。リストの長さが0であるかないかを判断することでマッチしているか否かを判断することが出来ます。

マッチした部分の取得

matchメソッド・searchメソッドの取り出し方

matchメソッドとsearchメソッドでマッチした部分の要素を参照したいときは、マッチオブジェクトのgroupメソッドを参照することで行えます。使い方の例を下に示します。

import re
str="abcdeabcde"
match1=re.match("abc",str)
match2=re.search("bcd",str)
print(match1.group())
print(match2.group())

実行結果

abc
bcd

また、マッチした部分の先頭文字の番号などを参照することが出来ます。詳しくはPythonで文字列を検索(match)する方法について(Python3)Pythonで文字列を検索(search)する方法について(Python3)を参考にしてみてください。

findallメソッドの取り出し方

findallメソッドでマッチした部分の要素を参照したいときは、for文を使用することで行なえます。

import re
str="abcdeabcde"
match=re.findall("abc",str)
for i in match :
    print(i)

実行結果

abc
abc

この記事のまとめ

本記事ではPythonでの文字列検索メソッド3種類を比較しました!最後に記事の要点をまとめます。それぞれのメソッドの働きをまとめると次の表のようになります。

メソッド先頭部分先頭以外の部分複数マッチgroupでの取り出しfor分での取り出し
match可能

可能

search可能
可能

可能

findall可能
可能
可能

可能
  • どの検索メソッドでも引数は検索したいパターンと検索する文字列
  • 文字列の先頭を検索するときはmatchメソッド
  • 検索結果が一つの場合はsearchメソッド、複数の場合はfindallメソッド

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