1. ホーム
  2. python

[解決済み] PythonでURLを正規表現で検証するには?

2022-11-22 12:37:54

質問

Google App Engineでアプリを構築しています。私はPythonに信じられないほど新しく、過去3日間、次の問題に対して頭を叩いています。

私はRSSフィードを表すクラスを持っており、このクラスの中にsetUrlというメソッドを持っています。このメソッドへの入力はURLです。

私はre pythonモジュールを使ってRFC 3986 Reg-exの検証をしようとしています( http://www.ietf.org/rfc/rfc3986.txt )

以下は は機能するのでしょうか?

p = re.compile('^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?')
m = p.match(url)
if m:
  self.url = url
  return url

どのように解決するのですか?

URL を簡単にパース (および検証) する方法として urlparse ( py2 , py3 ) モジュールを使用します。

正規表現が面倒くさい。


ほとんどのものが有効なURLになるので、"validate" メソッドはありません。 それを分割するための句読点の規則があります。 句読点がない場合でも、有効な URL があります。

RFC を注意深くチェックして、"invalid" URL を構築できるかどうかを確認します。 このルールは非常に柔軟です。

例えば ::::: は有効なURLです。 パスは ":::::" . かなり愚かなファイル名ですが、有効なファイル名です。

また ///// は有効なURLです。 netloc ("ホスト名")は "" . パスは "///" . また、愚かな。 も有効です。 この URL は正規化すると "///" に正規化されますが、これは同等です。

のようなものです。 "bad://///worse/////" は完全に有効です。 間抜けですが、有効です。

ボトムライン . 解析して、何か不愉快なことがないか、断片的に見てみましょう。

スキームを常に "http" にしたいですか? netloc が常に "www.somename.somedomain" であることを望みますか? パスは unix 風にしたいですか? それともウィンドウズ風? クエリ文字列を削除しますか? それとも保存しますか?

これらはRFCで規定された検証ではありません。 これらはあなたのアプリケーションに固有のバリデーションです。