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