
Pythonで文字列パターンの一部を検索したいときに便利なのが re.search()
です。
この記事では re.search()
の基本的な使い方から、活用シーン、注意点、他の正規表現メソッドとの違いまで、わかりやすく丁寧に解説します。
re.search() とは?
re.search()
は、文字列の中からパターンにマッチする最初の1箇所を探す関数です。
最初に一致した部分が見つかると「マッチオブジェクト(Match)」を返し、見つからなければ None
を返します。
正規表現ライブラリ re
に含まれているので、まずはインポートが必要です。
基本的な使い方
1 2 3 4 5 6 7 8 9 |
import re text = "My phone number is 080-1234-5678." pattern = r"\d{3}-\d{4}-\d{4}" match = re.search(pattern, text) if match: print("見つかった番号:", match.group()) |
\d{3}-\d{4}-\d{4}
は「電話番号の形式」にマッチする正規表現re.search()
でマッチを探すgroup()
を使うと、マッチした文字列(ここでは電話番号)を取得できる
上記の match
には「マッチした内容」や「位置情報」などが含まれています。
if match:
は 「match
が None
ではないか?」 を判定しており、検索する文字列が見つかったかどうかをチェックしています。
※Python ではオブジェクトが None
のときは False
として扱われます。
具体例:部分的な情報だけ抽出したい場合
()
を使ってグループ化すると、部分的に値を抽出できます。
1 2 3 4 5 6 7 |
pattern = r"(\d{3})-(\d{4})-(\d{4})" match = re.search(pattern, text) if match: print("市外局番:", match.group(1)) # 080 print("市内局番:", match.group(2)) # 1234 print("加入者番号:", match.group(3)) # 5678 |
ここで 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
を指定して 大文字・小文字を区別しない検索 を行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import re text = "I love Python" # 通常は "python" は大文字小文字が違うためマッチしない match1 = re.search(r"python", text) print(match1) # None # flags に re.IGNORECASE を指定すると大文字小文字を無視して検索 match2 = re.search(r"python", text, flags=re.IGNORECASE) if match2: print("見つかった:", match2.group()) # Python |
ここでのポイント:
- 通常の検索では
"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" という文字列に対して数字をすべて取り出したい場合:
1 2 |
re.findall(r"\d+", "abc123xyz456") # 出力: ['123', '456'] |
注意点
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のテキスト処理力が一気にアップします。
正規表現と組み合わせれば、複雑なデータ抽出も簡単に行えるようになるので、ぜひ覚えてみてくださいね!