スマートフォン・タブレットからインターネットサーバーオペレーション

APPW.jp
 

正規表現リファレンス

正規表現の概要

正規表現(Regular Expression)は、文字列のパターンを記述するための形式言語です。検索・置換・バリデーション・ログ解析など、テキスト処理のあらゆる場面で活用できます。一度覚えれば何年後も使い回せる「ツールボックスの基礎工具」です。

フォームバリデーション

メールアドレス・電話番号・郵便番号・クレジットカード番号など、入力値の形式チェックに使用します。

📋
アクセスログ解析

Apache / Nginx のアクセスログから IP・URI・User-Agent・ステータスコードを抽出・集計します。

🔡
文字列処理・クレンジング

不要な記号の除去、文字種の制限、日本語(ひらがな・カタカナ・漢字)の判別と変換に活用します。

🔍
検索・置換

テキストエディタ・grep・sed など各種ツールと組み合わせて、複雑なパターン検索・一括置換を行います。

正規表現は「忘れた頃に使う」ことが多い技術です。このページをブックマークして、必要なときにすぐ参照できるようにしておきましょう。

正規表現の構文解説

基本メタ文字

記号意味
.任意の1文字(改行を除く)a.c → "abc" "axc"
^行頭(文字列の先頭)^abc → "abc..."
$行末(文字列の末尾)abc$ → "...abc"
*直前の要素を0回以上繰り返すab* → "a" "ab" "abb"
+直前の要素を1回以上繰り返すab+ → "ab" "abb"
?直前の要素を0回または1回colou?r → "color" "colour"
{n}直前の要素をちょうどn回\d{4} → "2024"
{n,m}直前の要素をn回以上m回以下\d{2,4} → "12" "1234"
|OR(いずれか)cat|dog → "cat" or "dog"
\エスケープ(特殊文字を無効化)\. → ドット文字そのもの

文字クラス

記号意味同等表現
[abc]a, b, c のいずれか1文字
[^abc]a, b, c 以外の1文字否定クラス
[a-z]a〜z の小文字1文字
\d数字1文字[0-9]
\D数字以外の1文字[^0-9]
\w単語文字(英数字+_)[a-zA-Z0-9_]
\W単語文字以外[^a-zA-Z0-9_]
\s空白文字(スペース・タブ・改行等)[ \t\r\n\f\v]
\S空白文字以外[^ \t\r\n\f\v]

グループ・参照

記号意味
(...)グループ化(キャプチャあり)(ab)+ → "ab" "abab"
(?:...)グループ化(キャプチャなし)(?:ab)+ → キャプチャ不要な場合
\1, \2後方参照(1番目・2番目のキャプチャ)(.)\\1 → "aa" "bb"

先読み・後読み(ゼロ幅アサーション)

(?=...)
肯定先読み (Positive Lookahead)

直後に指定パターンが続く場合にマッチ。パターン自体は消費しない。

\d+(?=円) → "1000円" の "1000" にマッチ
(?!...)
否定先読み (Negative Lookahead)

直後に指定パターンが続かない場合にマッチ。除外条件の記述に有用。

\d+(?!円) → 数字の後が"円"でない場合にマッチ
先読みは「条件のみ確認し、マッチ位置を進めない」ゼロ幅アサーションです。複雑なバリデーション(例:パスワードが英字と数字を両方含む)に特に有効です。

正規表現の例

数値

数値全角数字のみ
/^[0-9]+$/

全角数字(0〜9)だけで構成された文字列。全角入力フォームのチェックに使用。

数値半角数字のみ
/^[0-9]+$/

半角数字のみ。\d+ と等価。数量・個数入力など。

数値全角・半角数字(混在可)
/^[0-90-9]+$/

半角・全角どちらの数字も受け付ける。スマートフォン入力対応フォームに。

数値小数・マイナス(半角)
/^[-]?[0-9]+(\.[0-9]+)?$/

マイナス符号と小数点を含む半角数値。例: -3.14

数値小数・マイナス(全角)
/^[ー]?[0-9]+(\.[0-9]+)?$/

全角マイナス(ー)・全角ドット(.)を含む全角数値。

アルファベット

英字小文字のみ
/^[a-z]+$/

半角小文字アルファベット。スラグ・識別子の検証など。

英字大文字のみ
/^[A-Z]+$/

半角大文字アルファベット。国コード・コード番号など。

英字英数字(大小混在)
/^[a-zA-Z0-9]+$/

英大文字・小文字・数字のみ。ユーザーID・パスワードの文字種チェックに。

英字小文字+数字
/^[a-z0-9]+$/

小文字英字と数字の組み合わせ。URLスラグ・ハッシュ値の検証に。

日本語文字種

日本語全角ひらがな
/^[ぁ-ん]+$/

ひらがなのみ。ふりがな入力フォームのバリデーションに使用。

日本語全角カタカナ
/^[ァ-ン]+$/

カタカナのみ。フリガナ入力(カタカナ指定)のチェック。

日本語半角カナ
/^[ァ-ン゙゚]+$/

半角カタカナ(濁点・半濁点含む)。レガシーシステムとの連携時に。

日本語漢字
/^[一-龥]+$/

CJK統合漢字の範囲。Unicode的に正確な範囲はUnicodeセクション参照。

日本語ひらがな+カタカナ+漢字
/^[ぁ-んァ-ン一-龥]/

日本語の主要3文字種をまとめてカバー。氏名入力などのゆるいチェックに。

連絡先・住所

連絡先メールアドレス(簡易)
/^\S+@\S+\.\S+$/

@と.を含むシンプルチェック。厳密な RFC5322 準拠が不要な場合に。

連絡先URL
/^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?/

http / https で始まるURL。クエリパラメータ・パスも許容。

電話固定電話(ハイフンなし10桁)
/^\d{10}$/

市外局番を含む10桁。例: 0312345678

電話携帯番号(ハイフンなし11桁)
/^\d{11}$/

携帯電話の11桁。例: 09012345678

電話10桁 or 11桁(いずれも可)
/^\d{10}$|^\d{11}$/

固定・携帯両対応の電話番号チェック。

郵便番号日本郵便番号(ハイフンあり7桁)
/^\d{3}[-]\d{4}$/

例: 123-4567 の形式。ハイフン必須。

郵便番号ハイフンあり・なし両方対応
/^\d{3}[-]\d{4}$|^\d{7}$/

ハイフンの有無を問わず7桁の郵便番号を受け付ける。

決済クレジットカード番号
/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})$/

VISA / Master / Diners / Discover / Amex の主要5ブランド対応。先頭桁でブランド判別。

文字列クレンジング

除去半角記号を除去する正規表現
[!-/:-@\[-`{-~]

ASCII の記号レンジ(!〜/ / :〜@ / [〜` / {〜~)にマッチ。re.sub() で空文字に置換することで除去できます。

[^0-9a-zA-Z0-9ぁ-んァ-ン一-龥]

英数字・ひらがな・カタカナ・漢字以外をすべて除去したい場合の否定クラス版。

アクセスログ解析への応用

Apache / Nginx の Combined Log Format を例に、正規表現による各フィールド抽出パターンをまとめます。

Combined Log Format の構造

192.168.1.100 - - [03/May/2026:15:28:10 +0900] "GET /index.html HTTP/1.1" 200 4321 "-" "Mozilla/5.0 (Linux; Android 13) AppleWebKit/537.36"
ログIPアドレス抽出
/^(\d{1,3}(?:\.\d{1,3}){3})/

行頭のIPv4アドレスをキャプチャ。グループ\1で取得できます。

ログリクエストURI抽出
/"(?:GET|POST|PUT|DELETE|HEAD)\s(\/[^\s"]*)/

HTTPメソッドに続くURIパス部分をキャプチャ。クエリ文字列も含む。

ログステータスコード抽出
/" (\d{3}) /

リクエスト行の直後に続く3桁のHTTPステータスコード。

ログUser-Agent抽出
/"([^"]+)"$/

行末のダブルクォート内文字列(User-Agent)をキャプチャ。

ログボットUA判定
/[Bb]ot|[Cc]rawler|[Ss]pider|[Ss]canner/

UA文字列にbot/crawler/spider/scannerを含む行をフィルタリング。

ログ静的ファイルを除外
/GET (?!.*\.(css|js|png|jpg|gif|ico|woff2?))/

否定先読みで静的アセットリクエストを除いたGETのみ抽出。

grep での活用例

# 404エラーのIPだけ抽出 grep ' 404 ' access.log | grep -oP '^[\d.]+' | sort | uniq -c | sort -rn # ボットを除いたユニークIPカウント grep -viP 'bot|crawler|spider' access.log | grep -oP '^[\d.]+' | sort -u | wc -l # 特定URIへのアクセスを時間帯別に集計 grep -P 'GET /api/' access.log | grep -oP '\d{2}(?=:\d{2}:\d{2})' | sort | uniq -c

Python re モジュールでの使い方

基本操作

import re # match() — 文字列の先頭からマッチするか確認 m = re.match(r'^[0-9]+$', '12345') if m: print('数字のみ OK') # search() — 文字列中のどこかにマッチするか確認 m = re.search(r'\d+', 'abc123def') print(m.group()) # → '123' # findall() — すべてのマッチをリストで取得 nums = re.findall(r'\d+', 'tel:03-1234-5678') print(nums) # → ['03', '1234', '5678'] # sub() — マッチ箇所を置換 result = re.sub(r'[!-/:-@\[-`{-~]', '', 'Hello, World!') print(result) # → 'Hello World' (記号を除去) # compile() — 繰り返し使うパターンはコンパイルしてキャッシュ pattern = re.compile(r'^[ぁ-ん]+$') print(pattern.match('ひらがな')) # Match object print(pattern.match('カタカナ')) # None

日本語文字除去(実践パターン)

import re # 英数字・ひらがな・カタカナ・漢字以外をすべて除去 def clean_japanese(text): pattern = re.compile( r'[^0-9a-zA-Z0-9\u3041-\u3096\u30A1-\u30FA' r'\u2E80-\u2FDF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF]' ) return pattern.sub('', text) print(clean_japanese('Hello! こんにちは◆World123')) # → 'Helloこんにちは World123'

アクセスログのパース(まとめ)

import re LOG_PATTERN = re.compile( r'^(?P<ip>[\d.]+) .+? \[(?P<time>[^\]]+)\] ' r'"(?P<method>\w+) (?P<uri>[^\s"]+)[^"]*" ' r'(?P<status>\d{3}) (?P<size>\d+|-) "[^"]*" "(?P<ua>[^"]*)"' ) with open('access.log') as f: for line in f: m = LOG_PATTERN.match(line) if m: d = m.groupdict() # d['ip'], d['uri'], d['status'], d['ua'] で各フィールドにアクセス if d['status'] == '404': print(f"{d['ip']} → {d['uri']}")

日本語 Unicode レンジ一覧

日本語の文字をUnicodeコードポイントで正確に扱う場合のレンジ一覧です。[一-龥] のような範囲指定よりも厳密な処理が必要な場合に参照してください。

文字種Unicodeレンジ正規表現(Python)備考
ひらがなU+3041–U+3096\u3041-\u3096小書き文字含む(ぁ〜ゖ)
カタカナU+30A1–U+30FA\u30A1-\u30FAァ〜ヺ(小書き・長音符含む)
CJK部首補助U+2E80–U+2FDF\u2E80-\u2FDF康熙部首含む
漢字の踊り字U+3005, U+303B\u3005\u303B々(繰り返し記号)〻
漢数字ゼロU+3007\u3007
CJK統合漢字拡張AU+3400–U+4DBF\u3400-\u4DBF希少漢字を含む
CJK統合漢字U+4E00–U+9FFF\u4E00-\u9FFF一般的な漢字の大半
CJK互換漢字U+F900–U+FAFF\uF900-\uFAFF互換性のために収録
CJK拡張B〜F等U+20000–U+2FFFF[\uD840-\uD87F][\uDC00-\uDFFF]サロゲートペア(JS等で注意)
JavaScriptでサロゲートペアを含む漢字を扱う場合は、/u フラグ(Unicode モード)を使うと [\u{20000}-\u{2FFFF}] のように簡潔に書けます。

包括的な日本語チェック(Python)

# 英数字 + 日本語全文字種を許可する包括パターン JP_FULL = re.compile( r'[^0-9a-zA-Z0-9' r'\u3041-\u3096' # ひらがな r'\u30A1-\u30FA' # カタカナ r'\u2E80-\u2FDF' # CJK部首補助 r'\u3005\u3007\u303B' # 踊り字・漢数字ゼロ r'\u3400-\u4DBF' # CJK拡張A r'\u4E00-\u9FFF' # CJK統合漢字 r'\uF900-\uFAFF]' # CJK互換 )

『正規表現リファレンス』を公開しました。