文字列のいずれかの位置でパターンとマッチするか調べる(Pattern.search)

Pattern クラスの search メソッドは、対象の文字列を先頭から順にパターンとマッチするかどうかを調べ、文字列のいずれかの位置でマッチするかどうかを調べます。ここでは Python の正規表現で search メソッドを使って文字列のいずれかの位置でパターンとマッチするか調べる方法について解説します。

(Last modified: )

searchメソッドの書式と使い方

Pattern クラスの search メソッドは、対象の文字列を先頭から順にパターンがマッチするかどうかを調べます。書式は次の通りです。

Pattern.search(string[, pos[, endpos]])

1 番目の引数に対象の文字列を指定します。文字列の先頭から順にパターンがマッチするかどうかを調べていき、マッチした場合はマッチオブジェクト(Match クラスのインスタンス)を返します。文字列の最後までマッチしなかった場合は None を返します。

省略可能な 2 番目と 3 番目の引数には、対象の文字列の中でマッチするかどうかをチェックする範囲を指定します。 pos から endpos - 1 までが範囲となります。 pos の初期値は 0 で endpos の初期値は文字列の長さです。

search メソッドでマッチが成功した場合、戻り値としてマッチオブジェクトを取得します。取得したマッチオブジェクトを条件式に記述した場合、常に True と判定されます。逆にマッチが失敗した場合に返される None は条件式に記述した場合 False と判定されます。

その為、 search メソッドを実行してマッチが成功したかどうかは次のような if 文を使って判定することができます。

import re

msg = 'lemon, apple, peach'
pattern = re.compile(r'apple')

result = pattern.search(msg)
if result :
    print('Matched')
else :
    print('Don\'t matched')

>> Matched

マッチした文字列を取得する

search メソッドの戻り値としてマッチオブジェクトを取得したら、 Match クラスで用意されているメソッドを使ってパターンにマッチした部分の文字列を取得したり、マッチした部分の文字列の中のインデックスを取得することができます。

※ マッチオブジェクトの詳しい利用方法については「マッチオブジェクトからマッチした文字列の情報を取得する(Match)」を参照されてください。

今回は Match クラスの group メソッドを利用してパターンにマッチした文字列全体を取得してみます。次のサンプルを見てください。

import re

def checkMatch(msg, pattern):
    result = pattern.search(msg)
    if result :
        print(result.group(0))
    else :
        print('Don\'t matched')

pattern = re.compile(r'apple')

checkMatch('lemon, apple, peach', pattern)
>> apple

checkMatch('grapes, cherry', pattern)
>> Don\'t matched/span>

対象の文字列がパターンにマッチするかどうかを調べ、マッチした場合はマッチした文字列を取得しました。

チェックする範囲を設定する

search メソッドの 2 番目と 3 番目の引数を指定することで、対象の文字列の中のチェックする範囲を設定することができます。例えば対象の文字列が '東京都港区赤坂' だった場合、 search メソッドで 2 番目と 3 番目の引数を省略した場合は '東京都港区赤坂' が対象となります。

チェックする範囲を設定する(1)

search メソッドの 2 番目の引数に 1 、 3番目の引数に 4 を指定した場合は対象の文字列が '京都港' となります。

チェックする範囲を設定する(2)

次のサンプルを見てください。文字列は同じですが、対象の範囲を変えて search メソッドを実行しています。

import re

def checkMatch(msg, pattern, start, end):
    result = pattern.search(msg, start, end)
    if result :
        print(result.group(0))
    else :
        print('Don\'t matched')

msg = '東京都港区赤坂'
pattern = re.compile(r'東京')

checkMatch(msg, pattern, 0, 7)
>> 東京

checkMatch(msg, pattern, 1, 4)
>> Don\'t matched

対象の文字列の範囲を変更したため、 2 回目の時はマッチしなくなりました。

-- --

Python の正規表現で search メソッドを使って文字列のいずれかの位置でパターンとマッチするか調べる方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。