Pythonのパターン一覧表 | 文字列の操作 | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
ad. 価格範囲を指定して商品を探せます

Pythonの正規表現パターン一覧表

正規表現(レギュラーエクスプレッション)とは、特定の文字の並びをパターン化して表現する方法です。これを使うことで、複雑な文字列の検索や抽出、入力チェックを一瞬で行うことができます。まずはよく使われるパターンの一覧を確認しましょう。

正規表現 説明
^ 行の先頭に一致 ^abc は "abc" で始まる文字列に一致
$ 行の末尾に一致 abc$ は "abc" で終わる文字列に一致
. 任意の1文字(改行除く)に一致 a.b は "a" と "b" の間に任意の文字がある文字列に一致
* 直前の要素の0回以上の繰り返し(最長一致) ab*c は "ac", "abc", "abbc" に一致
+ 直前の要素の1回以上の繰り返し(最長一致) ab+c は "abc", "abbc" に一致
? 直前の要素が0回または1回 ab?c は "ac", "abc" に一致
[] 文字クラス、指定した文字のいずれかに一致 [abc] は "a", "b", "c" のいずれかに一致
[^] 文字クラス、指定した文字以外に一致 [^abc] は "a", "b", "c" 以外に一致
() グループ化、キャプチャ (abc) は "abc" に一致し、その部分を取り出せる
| OR (または) に一致 a|b は "a" または "b" に一致
\d 数字 (0-9) に一致 \d は "0" から "9" に一致
\D 数字以外に一致 \D は数字以外に一致
\w 英数字またはアンダースコアに一致 \w は "a-zA-Z0-9_" に一致
\W 英数字またはアンダースコア以外に一致 \W はそれ以外に一致
\s 空白文字に一致 \s はスペース、タブ、改行などの空白に一致
\S 空白以外に一致 \S は空白文字以外に一致
\b 単語境界に一致 \bword\b は "word" という独立した単語に一致
\B 単語境界以外に一致 \Bword\B は他の文字に挟まれた "word" に一致
{n} n回繰り返す a{3} は "aaa" に一致
{n,} n回以上繰り返す a{2,} は "aa", "aaa", "aaaa" に一致
{n,m} n回からm回まで繰り返す a{2,4} は "aa", "aaa", "aaaa" に一致
(?=...) ポジティブの先読み a(?=b) は "a" の直後に "b" が続く場合の "a" に一致
(?!...) ネガティブの先読み a(?!b) は "a" の直後に "b"が続かない場合の "a" に一致
(?<=...) ポジティブの後読み (?<=a)b は "a" の直後にある "b" に一致
(?<!...) ネガティブの後読み (?<!a)b は "a" の直後にない "b" に一致
\ 特殊文字のエスケープ \. は本来の意味(任意の1文字)ではなく、文字としての "." に一致

Pythonにおける正規表現の使い方

Pythonでは、標準ライブラリの re モジュールをインポートすることで、正規表現を使った高度な文字列処理を簡単に行うことができます。

追加解説:Pythonで正規表現を書く時は「r」を忘れるな!

Pythonで正規表現のパターン文字を書くときは、文字列の先頭に r'...' と記述する慣習(raw文字列記法)があります。これがないと、正規表現で多用する \d\s のバックスラッシュ(\)が、Python本来の改行(\n)などのエスケープシーケンスと衝突してしまい、思わぬバグやエラーを引き起こしてしまいます。正規表現を扱う際は、常に r を付ける癖をつけましょう。

基本的な例と重要関数の違い

文字列を検索する代表的な関数には re.search()re.match() があります。この2つは「検索を始める位置」のルールが異なるため、初心者が非常につまずきやすいポイントです。

  • re.search(): 文字列のどこか(途中でも可)にパターンが含まれているかを検索します。
  • re.match(): 文字列の先頭からパターンが始まっているかを厳格にチェックします。
import re

pattern = r'abc'
string = '..abcde'  # 先頭にドットが2つある文字列

# 1. search関数(文字列の途中でも見つけてくれる)
result_search = re.search(pattern, string)
print(result_search is not None)  # True

# 2. match関数(先頭から一致していないと見落とす)
result_match = re.match(pattern, string)
print(result_match is not None)  # False(先頭が '..' なので見つからない)

修飾子(フラグ)

Pythonの正規表現には、検索の挙動をコントロールする以下のフラグ(修飾子)をオプションとして付けることができます。

  • re.IGNORECASE (または re.I): 大文字と小文字を区別せずに検索します。
  • re.MULTILINE (または re.M): 対象の文字列が複数行ある場合、^$ を各行の先頭・末尾に適用させます。
  • re.DOTALL (または re.S): 本来は改行を含まない .(任意の1文字)に、改行文字も含めるようにします。
  • re.VERBOSE (または re.X): 正規表現のパターン内に空白やコメント(#)を書き込めるようになり、複雑なパターンの可読性を上げることができます。
# 修飾子の使用例(大文字小文字を無視)
text = "I love PYTHON"
result = re.search(r"python", text, re.IGNORECASE)
print(result is not None)  # True

特定のパターンの例(実務での定番レシピ)

実務の入力フォームチェックなどでよく使われる具体的な正規表現パターンです。全体の完全一致を確かめるために、先頭を示す ^ と末尾を示す $ でパターン全体を囲んでいる点に注目してください。

Emailアドレスの検証

import re

email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
print(re.match(email_regex, "example@example.com") is not None)  # True
print(re.match(email_regex, "invalid-email@") is not None)        # False

URLの検証

import re

url_regex = r'^(https?:\/\/)?([\w\d\-]+\.)+\w{2,}(\/.*)?$'
print(re.match(url_regex, "https://example.com") is not None)  # True

電話番号の検証(日本形式)

import re

phone_regex = r'^\d{2,4}-\d{2,4}-\d{4}$'
print(re.match(phone_regex, "090-1234-5678") is not None)  # True
print(re.match(phone_regex, "09012345678") is not None)    # False(ハイフンがないため)

まとめ

Pythonの正規表現は、パターンマッチングや文字列の検索・抽出・置換に非常に強力なツールです。記述が独特なため初めは難しく感じられますが、re モジュールの searchmatch、そして r'...'(raw文字列)のルールを押さえておけば、テキスト処理の効率が格段にアップします。よく使うパターンを手元に置きながら、少しずつコードに組み込んで慣れていきましょう。