format_list_bulleted
【Python】検索メソッド(match,search,findall)のflagについて
最終更新日時:2020-05-03 12:57:44



Python(Python3)ではmatch、search、findallなどの検索メソッドを使用することが出来ます。基本的にはこれらのメソッドは2つの引数で呼び出すことが出来ますが、第三引数をflagとして指定することが出来ます。flagを指定することでより複雑な検索が可能になる場合があります。今回はflagとして使えるものの中で、代表的なもの・便利なものをいくつか紹介します。この記事では各種メソッドや正規表現の使い方については深くは触れません。詳しく知りたい方は以下の記事を参照してください。

flagの呼び出し方

flagを使用せずに各メソッドを呼び出す場合は次のように記述します。

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

flagを使用する場合は次のように記述します。

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

第三引数に後述するflagを記述します。

flagの代表例

使用できる主なflagを次に示します。この記事には代表的なものしか掲載していないので、より詳しく知りたい方はPythonの公式ドキュメントをご覧ください。

re.ASCII(ASCII文字にのみマッチ)

flagにre.ASCIIを指定することで、「\W、\w、\b、\B、\d、\D、\s、\S」がASCII文字(半角英数字・記号・制御文字など)にのみマッチするようになります。日本語(かな・漢字)や全角英数字などはASCII文字には含まれません。例えばこのflagを使用することで、「\w(英数字と日本語(かな、漢字)など1字を示す)」を用いて日英混合の文章から英語のみを取り出すことが出来ます。

import re
str="""本サイトはプログラミングに関する情報を、codeとともに紹介します。"""
match_list1=re.findall(r'\w+',str)
match_list2=re.findall(r'\w+',str,re.ASCII)
print(match_list1)
print(match_list2)

実行結果

['本サイトはプログラミングに関する情報を','codeとともに紹介します。']
['code']

デフォルトの場合では「、」や「。」を除く日本語と英語1字以上がマッチしていますが、flagを使用することによって英語1字以上にのみマッチしています。

re.IGNORECASE(大文字小文字を区別しない)

flagにre.IGNORECASEを指定することで英数字の大文字小文字を区別しないようになります。

import re
str="""本サイトはプログラミングに関する情報を、codeとともに紹介します。"""
match_list1=re.findall('CODE',str)
match_list2=re.findall('CODE',str,re.IGNORECASE)
print(match_list1)
print(match_list2)

実行結果

[]
['code']

flagがなしの場合は大文字小文字が区別されるためマッチしません。flagをつけることによって、大文字小文字が区別されなくなり、’code’がマッチします。

re.MULTILINE(「^」と「$」を全ての行にマッチ)

flagにre.MULTILINEを指定することで、「^」が文字列の全ての行の先頭にマッチするようになります(デフォルトは文字列の先頭のみ)。また、「$」が文字列の全ての行の末尾にマッチするようになります(デフォルトは文字列の最終行の末尾のみ)。

import re
str="""1abcdef1
2abcdef2"""
match_list1=re.findall(r'^[1,2][a-c]+',str)
match_list2=re.findall(r'^[1,2][a-c]+',str,re.MULTILINE)
match_list3=re.findall(r'[c-f]+[1,2]$',str)
match_list4=re.findall(r'[c-f]+[1,2]$',str,re.MULTILINE)
print(match_list1)
print(match_list2)
print(match_list3)
print(match_list4)

実行結果

['1abc']
['1abc', '2abc']
['cdef2']
['cdef1', 'cdef2']

flagをつけない場合は「^」が文字列の先頭、「$」が文字列の末尾にしかマッチしていないことが分かります。flagをつけることで各行の先頭と末尾にマッチします。

re.DOTALL(「.」に改行を含める)

flagにre.DOTALLを指定することで「.」が改行を含む任意の一文字になります(デフォルトでは改行以外の任意の一文字)。

import re
str="""abc
def"""
match_list1=re.findall(r'.+',str)
match_list2=re.findall(r'.+',str,re.DOTALL)
print(match_list1)
print(match_list2)

実行結果

['abc', 'def']
['abc\ndef']

flagをつけない場合は改行でマッチが途切れてしまいますが、flagを設定すると、改行を含んでマッチされます。「\n」は改行を示します。

この記事のまとめ

今回は各種検索メソッドで使用できるflagについて解説しました。

  • re.ASCIIはASCII文字のみマッチ
  • re.IGNORECASEは大文字小文字を区別しない
  • re.MULTILINEは「^」と「$」が文字列の先頭・末尾だけでなく各行の先頭・末尾にもマッチ
  • re.DOTALLは「.」が改行(\n)を含む任意の文字にマッチ

検索メソッドを用いる際にflagを活用しましょう!