AI資格ドリル
資格を選ぶ

用語比較

re.match()とre.search()の違い|文字列の先頭だけ調べるか、どこにあっても探すか(Python3基礎)

re.match()とre.search()の違いは調べる範囲で、match()は文字列の先頭だけ、search()は文字列のどこにあっても最初に合う場所を探します。どちらも見つかればMatchオブジェクトを、見つからなければNoneを返します。

match()はMULTILINEモードでも文字列の先頭にしか合わず、各行の先頭には合いません。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。

re.match()とre.search()の要点

re.match()

文字列の先頭がパターンに合うかを調べる。先頭で合わなければ、途中に合う部分があってもNoneになる。

re.search()

文字列を先頭から走査し、パターンが最初に合う場所を探す。どの位置にあっても見つかる。

違いを表で確認

比較軸re.match()re.search()
調べる範囲文字列の先頭だけ文字列のどの位置でも
re.match('c', 'abcdef')の場合None(先頭は'a'で、'c'ではない)re.search('c', 'abcdef')は、2〜3の位置で'c'に合うMatchを返す
MULTILINEを指定したときそれでも文字列の先頭にしか合わない。各行の先頭には合わないパターンに^を書けば、各行の先頭にも合う
見つからなかったときNoneを返すNoneを返す
文字列全体との一致先頭から合えばよく、末尾まで合う必要はない文字列全体が合うことを調べるには、fullmatch()を使う

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

re.match(r'\d+', 'abc123') がNoneになった人

match()は先頭の'a'から数字が続くかを調べるので、途中の'123'は見つけません。re.search(r'\d+', 'abc123') なら'123'が見つかります。

02

先頭が決まった形かどうかだけ確かめたい人

先頭が決まった形かの確認なら、match()が合っています。re.match(r'\d+', '123abc') は先頭の'123'に合います。

03

文字列全体が決まった形かを確かめたい人

match()は先頭から合えばよく、末尾の残りは問いません。全体が合うかを調べるときは、fullmatch()を使います。re.fullmatch('ab', 'abc') はNone、re.fullmatch('abc', 'abc') は合います。

具体例で使い分ける

例 1

'abcdef'から'c'を探す場合

re.match('c', 'abcdef') と re.search('c', 'abcdef') を、それぞれ実行する場面です。

  • 文字列'abcdef'の先頭は'a'です。match()は先頭がパターンに合うかを調べるので、'c'には合わず、結果はNoneです。
  • search()は先頭から順に走査し、'c'が最初に現れる位置で合います。結果は、2から3の位置で'c'に合うMatchです。

結論: match()はNone、search()は'c'に合うMatchを返します。

例 2

複数行の文字列で、行の先頭を探す場合

文字列 'A\nB\nX' に対し、MULTILINEを指定して、re.match('X', s, re.MULTILINE) と re.search('^X', s, re.MULTILINE) を実行する場面です。

  • match()は、MULTILINEモードでも文字列の先頭にしか合いません。先頭は'A'なので、結果はNoneです。
  • search()でパターンに^を書くと、MULTILINEモードでは各行の先頭にも合います。3行目の先頭の'X'に合います。

結論: match()はNone、search('^X')は3行目の'X'に合うMatchを返します。

問題文から答えを選ぶ手順

  1. 1

    先頭だけか、どこでもかを決める

    先頭が決まった形かを調べたいのか、文字列のどこかに合う部分があるかを調べたいのかを決めます。

  2. 2

    途中も探すならsearch()

    文字列のどこにあっても探したいなら、search()を使います。公式もそう説明しています。

  3. 3

    全体が合うかならfullmatch()

    文字列全体がパターンに合うかを確かめたいときは、fullmatch()を使います。

  4. 4

    結果がNoneのときの扱いを書く

    見つからなかった場合はNoneが返るので、m.group(0)のようにMatchの操作をする前に、Noneでないことを確かめます。

試験での見分け方

  • 1match()は文字列の先頭だけ、search()は文字列のどの位置でも、パターンに合う場所を探す。
  • 2MULTILINEを指定しても、match()は各行の先頭には合わない。
  • 3文字列全体がパターンに合うかを調べるには、fullmatch()を使う。

誤答しやすい選択肢

match()は文字列のどこでも探してくれると考える

修正: match()は先頭だけです。途中にある語を探すなら、search()を使います。

match()が合えば、文字列全体が合ったと考える

修正: match()は先頭から合えばよく、末尾の残りは問いません。全体を調べるにはfullmatch()を使います。

結果がNoneかを調べずに、group()を呼ぶ

修正: 合う部分がないときはNoneが返ります。Noneにgroup()を呼ぶとエラーになるので、先にNoneかどうかを確かめます。

確認問題

Q1re.match('c', 'abcdef') の結果は何ですか?

答え: None

match()は文字列の先頭が合うかを調べます。先頭は'a'なので、'c'には合いません。

Q2re.search(r'\d+', 'abc123').group(0) の結果は何ですか?

答え: '123'

search()は文字列の途中でも、最初に合う場所を探します。'abc'の後ろの'123'に合います。

Q3文字列全体がパターンに合うかを調べたいとき、使う関数は何ですか?

答え: re.fullmatch()

fullmatch()は、文字列全体がパターンに合うときだけMatchを返します。たとえばre.fullmatch('ab', 'abc')はNoneです。

到達チェック

  • match()とsearch()の調べる範囲の違いを言える
  • re.match('c', 'abcdef')がNoneになる理由を説明できる
  • MULTILINEでもmatch()は各行の先頭に合わないと言える
  • 全体の一致にはfullmatch()を使うと答えられる

同じ資格で次に知りたいこと

よくある質問

Qre.matchとre.searchの一番大きな違いは何ですか?

A

調べる範囲です。match()は文字列の先頭だけ、search()は文字列のどの位置でも、パターンに合う場所を探します。

Qre.matchで文字列の途中が見つからないのはなぜですか?

A

match()は先頭がパターンに合うかしか調べないためです。途中にある部分を探すなら、search()を使います。

QMULTILINEを指定すると、matchは各行の先頭に合いますか?

A

合いません。公式は、MULTILINEモードでも、match()に当たる関数は文字列の先頭にしか合わず、各行の先頭には合わないと説明しています。

QPython 3.15でre.match()は使えなくなりますか?

A

公式ドキュメントの最新版は、3.15で同じ働きのprefixmatch()という名前が加わり、match()は新しい名前に置き換えることが望ましい(ソフト非推奨)としています。match()は旧バージョンとの互換のために使い続けられる、とも書かれています。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)