Pythonで正規表現を使ってURLを検証する方法|状況別の実践テクニック
URLには「validate(検証)」という専用メソッドが存在しません。その理由は、ほとんどどんな文字列でもURLとして有効になり得るからです。URLにはピリオドやスラッシュなどの区切り文字に関する一定の規則がありますが、仮に句読点が一切含まれていなくても、それでも有効なURLと見なされるのです。
そのため、URLの検証は「何を確認したいのか」という目的に応じて使い分けることが重要です。状況別に、以下の3つのアプローチが推奨されます。
- データを信頼できて、プロトコルがHTTPかどうかだけ確認したい場合:
urlparseを使うのが最もシンプルで確実です。 - URLとして正しい形式かどうかを厳密に確認したい場合:詳細な正規表現パターンを使用します。
- 実際に存在するWebアドレスかどうかを確認したい場合:実際にリクエストを送信して応答を確かめます。
1. urlparseでプロトコルを確認する
入力データである程度信頼できる場合は、標準ライブラリのurllib.parseを使えば十分です。
from urllib.parse import urlparse
url = "https://example.com/page"
result = urlparse(url)
if result.scheme in ('http', 'https'):
print("HTTP/HTTPSのURLです")
else:
print("HTTPプロトコルではありません")
2. 正規表現でURLの形式を検証する
URLが正しい構造を持っているかを厳密にチェックしたい場合は、正規表現を使います。RFCに完全準拠したパターンは非常に長大で複雑になるため、実用上は必要な要素をカバーする簡略化されたパターンを使うのが一般的です。
import re
pattern = re.compile(
r'^(?:http|ftp)s?://' # スキーム(http / https / ftp など)
r'(?:\S+(?::\S*)?@)?' # ユーザー名・パスワード(任意)
r'(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2}' # ドメイン名
r'(?::\d{2,5})?' # ポート番号(任意)
r'(?:/\S*)?$' # パス(任意)
)
url = "https://example.com/path?query=1"
if pattern.match(url):
print("有効なURL形式です")
else:
print("無効なURL形式です")
このパターンはスキーム、認証情報、ドメイン、ポート番号、パスといったURLの主要構成要素を網羅しており、多くの実務ケースで十分に機能します。
3. 実際にアクセス可能なURLか確認する
形式が正しくても、そのアドレスが実際に存在するとは限りません。実在性を確認したい場合は、実際にHTTPリクエストを送信してみるのが最も確実な方法です。
import urllib.request
url = "https://example.com"
try:
urllib.request.urlopen(url)
except Exception:
print("実際にはアクセスできないURLです")
まとめ
URLの検証方法は目的によって異なります。軽微なチェックであればurlparse、形式の厳密な検証には正規表現、そして実在の確認には実際のHTTPリクエストを使い分けることで、用途に合った適切なバリデーションを実現できます。過剰に複雑な検証はユーザー体験を損なうこともあるため、必要なレベルに応じた手法を選択しましょう。
-
【初心者向け】Python正規表現のグループ化の仕組みと使い方を徹底解説
グループ化とは正規表現における「グループ化」とは、パターンの一部を丸括弧 () で囲むことです。これにより、単一の文字だけでなく、グループ全体に対して量指定子(*、+ など)や各種演算子を適用できるようになります。キャプチャグループと後方参照丸括弧には、部分式をひとまとめにする役割に加えて、「キャプチャグループ」を作成する働きもあります。グループ化された部分がマッチした文字列は「後方参照(バックリファレンス)」として保存され、あとから再利用することが可能です。実際の開発では、2つ以上の候補のどれかにマッチする正規表現が必要になる場面が多くあります。また、量指定子を複数の式全体に適用したいケース
-
Pythonでファイルに追記する方法をわかりやすく解説
Pythonで既存のファイルにデータを追加(追記)するには、ファイルを開く際にモードとして「a」(append=追記)を指定します。通常の「w」モードで開くとファイルの中身がすべて上書きされてしまうため、既存の内容を残したい場合は必ず「a」モードを使用しましょう。基本的な追記の書き方f = open(my_file.txt, a) f.write(Hello World) f.close()このコードでは、my_file.txt を追記モードで開き、ファイルの末尾に「Hello World」という文字列を追加しています。元の内容はそのまま保持され、新しいテキストが末尾に付け足されます。with