2017-02-17 6 views
0

したがって、いくつかのlulzのために、友人と私は、親ドメインのみを取得するためにURLのリスト(100k +)をフィルタリングするアイデアを演奏していました| org | etc ")。唯一注意しなければならないのは、それらがすべていいとは言えず、形式が一致していないということです。矛盾したURLフィルタリングのための正規表現の正確さ/簡潔さを改善する

説明すると、「http://www.domain.com/urlstuff」、「www.domain.co.uk/urlstuff」のような国コードがあるものもあれば、「hello.in」と似ているものもあります。 con.sistent.urls.com/urlstuff "

import re 

firsturl = 'www.foobar.com/fizz/buzz' 
m = re.search('\w+(?=(\..{3}/|\..{2}\..{2}/))\.(.{3}|.{2}\..{2})', firsturl) 

m.group(0) 

返します:

foobar.com 

をそれは戻って、その後、URLの末尾に "/" 最初を調べ

ので、脇の話、私は働く正規表現を持っています二つ "。"その前に区切られたフィールド。

私のクエリでは、スタックハイブの人は、より良い/より短い正規表現、または "/"の前方参照に依存しない正規表現でどのように行うことができるかについての知恵を持っていますか?文字列?

これですべての助けに感謝!これが唯一の'http://'せずに動作すること、しかし、

import re 
firsturl = 'www.foobar.com/fizz/buzz' 
domain = re.match("(.+?)\/", firsturl).group() 

お知らせ:

+0

本当に 'regex'を使用する必要がありますか? –

+0

多くの問題と同様、多くの解決策があります。 Pythonでは、文字列を繰り返し、区切り文字( "。")で区切って、必要なものをまとめていくのは簡単でpythonです。だから、私はそれが正規表現の外で簡単に行うことができることを知っていますが、正規表現のコンテキストで私はそれが私が持っているものよりも良いことができるかどうか不思議です。 – RedBarron

答えて

1

正規表現はこれに適したツールだと思います。正規表現はパターンマッチングです。この場合のようにいくつかのパターンがある可能性がある既知のパターンがある場合に最適です。

問題の説明と解決策の試行では、私はあなたがそれを大幅に単純化していると思います。 TLDは、「2桁の国別コード」や「3桁の数字」よりも多くの味があります。現在入手可能な何百もの数字については、ICANN's list of top-level domainsを参照してください。長さは2桁以上です。また、スラッシュのないURLや、ドメイン名の後ろにスラッシュやドットが複数あるURLもあります。

だからここ(see on regex101)私のソリューションです:

^(?:https?://)?(?:[^/]+\.)*([^/]+\.[a-z]{2,})

何がしたい最初に一致したグループに取り込まれます。

内訳

  • ^(?:https?://)?が開始
  • (?:[^/]+\.)*可能な複数の非スラッシュ配列と一致、ドットに続く各
  • ([^/]+\.[a-z]{2,})マッチ(およびキャプチャ)1つの最終の非で可能プロトコルと一致スラッシュシーケンスの後ろにドットとTLD(2+の文字)が続きます
+0

ありがとうブライアン、私はこれをたくさんいただきありがとうございます!これは、より少ない仮定で動作し、矛盾する文字列に対してより強力です。これは本当に有益です^^ – RedBarron

0

あなたが代わりにこの正規表現を使用することができます。

関連する問題