【Python】re.search() とは?使い方や引数のオプション、他のメソッドとの違いをわかりやすく解説!

Pythonで文字列パターンの一部を検索したいときに便利なのが re.search() です。

この記事では re.search() の基本的な使い方から、活用シーン、注意点、他の正規表現メソッドとの違いまで、わかりやすく丁寧に解説します。

re.search() とは?

re.search() は、文字列の中からパターンにマッチする最初の1箇所を探す関数です。

最初に一致した部分が見つかると「マッチオブジェクト(Match)」を返し、見つからなければ None を返します。

正規表現ライブラリ re に含まれているので、まずはインポートが必要です。

基本的な使い方

このコードでは:

  • \d{3}-\d{4}-\d{4} は「電話番号の形式」にマッチする正規表現
  • re.search() でマッチを探す
  • group() を使うと、マッチした文字列(ここでは電話番号)を取得できる

上記の match には「マッチした内容」や「位置情報」などが含まれています。

if match:matchNone ではないか? を判定しており、検索する文字列が見つかったかどうかをチェックしています。
※Python ではオブジェクトが None のときは False として扱われます。

具体例:部分的な情報だけ抽出したい場合

() を使ってグループ化すると、部分的に値を抽出できます。

ここで group(n) メソッドは以下のように動作します:

  • group() → マッチ全体を返す
  • group(1) → 1番目の括弧にマッチした部分
  • group(2) → 2番目の括弧にマッチした部分
  • group(3) → 3番目の括弧にマッチした部分

このように、group(n) を使えば、マッチした部分のうちn番目のグループを取り出せます。

re.search() の主な引数

re.search() には、検索の挙動を決めるための引数があります。

引数名 役割
pattern 検索対象の正規表現パターン r"\d{3}-\d{4}-\d{4}"
string 探したい文字列(本文) "電話番号は 080-1234-5678 です"
flags 正規表現の動作オプションを指定できる re.IGNORECASE, re.MULTILINE など

例えば、次のコードでは flags を指定して 大文字・小文字を区別しない検索 を行っています。

ここでのポイント:

  • 通常の検索では "python""Python" は別物として扱われます。
  • flags=re.IGNORECASE を指定すると、大文字・小文字を無視して検索できるので "Python" にもマッチします。
  • 他にも re.MULTILINE(複数行テキストを行単位で処理)、re.DOTALL. が改行にもマッチするようにする)など便利なオプションがあります。

つまり、flags を活用すると 正規表現の検索ルールを柔軟にカスタマイズできる ため、実用的なテキスト処理がしやすくなります。

正規表現のよく使うパターン一覧

Python の正規表現でよく使われる記号や構文をまとめました。

コードを書く時にパッと参照できるようブックマークしておくのがおすすめです!

パターン 意味
. 任意の1文字(改行を除く) a.b は "acb" にマッチ
^ 文字列の先頭 ^Hello は "Hello world" にマッチ
$ 文字列の末尾 end$ は "the end" にマッチ
* 直前の文字が0回以上繰り返される lo* は "looong" にマッチ
+ 直前の文字が1回以上繰り返される lo+ は "looooong" にマッチ
? 直前の文字が0回または1回 colou?r は "color" と "colour" にマッチ
{n} n回繰り返し \d{4} は4桁の数字にマッチ
{n,m} n〜m回の繰り返し \d{2,4} は2〜4桁の数字
[] いずれか1文字にマッチ [aeiou] は母音にマッチ
[^] 指定以外の1文字にマッチ [^0-9] は数字以外にマッチ
\d 数字と一致([0-9]) \d+ は連続する数字にマッチ
\D 非数字と一致 \D+ は数字以外にマッチ
\w 英数字またはアンダースコア \w+ は単語にマッチ
\W 非単語文字(空白や記号など) \W+ は記号やスペースにマッチ
\s 空白文字(スペース、タブなど) \s+ は連続する空白にマッチ
\S 空白以外の文字 \S+ は非空白文字列にマッチ
| OR条件(いずれかに一致) cat|dog は、「cat または dog」のどちらかにマッチ
() グループ化またはキャプチャ (\d+)-(\d+) で電話番号の区切りを分ける

※バックスラッシュを使うパターン(\d, \sなど)は、Pythonコード内では r"..." のように「raw文字列」で書くのが基本です。

たとえば、\d{4} は「4桁の数字」、^Hello は「Helloで始まる文字列」にマッチします。

複雑なパターンも、上記の記号を組み合わせることで表現できます。

他のメソッドとの違い

メソッド 特徴
re.search() 文字列全体の中から最初にマッチした1箇所を返す
re.match() 文字列の先頭がマッチするかどうかを調べる(先頭以外は無視)
re.findall() すべてのマッチ部分をリストで取得
re.finditer() マッチしたすべてをイテレータ(メモリ効率が良い)で返す

例えば、"abc123xyz456" という文字列に対して数字をすべて取り出したい場合:

注意点

re.search() を使うときには、いくつか気をつけておくべきポイントがあります。

  • 一致しない場合は None を返すので、必ず if match: でチェックすること。
  • match.group() を呼ぶ前に None チェックしないとエラーになる。
  • re.match() と混同しないように注意。 re.search() は文字列のどこにあってもOK、re.match() は先頭限定。

つまり、re.search() を安全に使うには、まず None の可能性を考えてチェックし、どの関数を使うべきかを状況に応じて選ぶことが大切です。

まとめ

re.search() は Python の正規表現処理で、最初の一致を簡単に探すための基本メソッド です。

  • re.search() は、文字列中にあるパターンの最初の一致を探す基本メソッド
  • 見つかるとマッチオブジェクトを返し、見つからなければ None
  • group()group(n) を使ってマッチした文字列や部分を取り出せる
  • バリデーション、ログ解析、スクレイピングなど幅広い場面で活用できる
  • 他の正規表現メソッド(match, findall, finditer)との違いも理解して使い分けよう

re.search() をしっかり理解することで、Pythonのテキスト処理力が一気にアップします。

正規表現と組み合わせれば、複雑なデータ抽出も簡単に行えるようになるので、ぜひ覚えてみてくださいね!

 

おすすめの記事