🐍 Python
re.search(pattern, string, flags=0)
文字列のどこかでパターンに一致する箇所を探す関数です。re.matchが先頭限定なのに対し、re.searchは文字列全体を対象に最初の一致箇所を探します。「メールアドレスが含まれているか」「特定の単語が文章のどこかにあるか」を調べたいときは、こちらを使うのが基本です。
構文: re.search(pattern, string, flags=0)
戻り値: 最初に一致した箇所のMatchオブジェクト、無ければNone
基本の使い方:文字列のどこにあっても見つける
先頭になくても、文字列中に一致箇所が1つでもあれば見つけ出します。
import re
m = re.search(r'\d+', 'abc123xyz')
print(m.group()) # '123'(先頭になくても見つかる)
一致箇所が無ければNone
文字列のどこにも一致箇所が無ければ、re.matchと同じくNoneが返ります。if文で確認してから使うのが安全です。
import re
m = re.search(r'\d+', 'abcxyz')
print(m) # None(数字が1つも含まれていない)
グループでメールアドレスの一部を取り出す
文章の中に埋もれたメールアドレスから、ユーザー名とドメイン部分だけを取り出す例です。
import re
m = re.search(r'(\w+)@(\w+)\.com', 'contact: alice@example.com')
print(m.group(1)) # 'alice'
print(m.group(2)) # 'example'
print(m.group()) # 'alice@example.com'(一致した全体)
re.MULTILINEで各行の先頭を探す
複数行の文字列に対して、通常^は文字列全体の先頭だけを意味しますが、re.MULTILINEフラグを付けると「各行の先頭」という意味に変わります。re.findallと組み合わせると、各行の先頭にある単語をまとめて取り出せます。
import re
text = "1st line\n2nd line\n3rd line"
print(re.findall(r'^\d\w+', text, re.MULTILINE))
# ['1st', '2nd', '3rd'](MULTILINEが無いと最初の行しか一致しない)
パラメータ
- pattern
- 検索する正規表現パターン(文字列)。raw文字列
r'...'で書くのが基本 - string
- 検索対象の文字列
- flags(省略可)
- 大文字小文字無視や複数行モードなどの動作オプション。詳しくはflagsのページを参照
💡 re.matchとre.findallとの違い
re.searchは最初に見つかった1件だけを返します。一致箇所が複数あるかもしれず、その全部が欲しい場合はre.findallやre.finditerを使ってください。「先頭だけでよいか」「どこでもよいから1件見つかればよいか」「複数箇所すべて欲しいか」の3択を意識すると、match/search/findallのどれを使うべきかを迷わなくなります。