削除方法は、重複した領域から大型リストのUrl?RegExその他
-
25-09-2019 - |
質問
私は、もともとはとても良いタイミングでの質問: 正規表現にgVim除重複した領域リストから
しかし、私は私が見つこい"幅を広げる"という意味液思います。
いて情報をお送りしたいと思い箇所は私の質問&肉を取得し、よりよい解決方法はこちらに---う:
私は大きなリストのUrlました。txtファイル(私はWindows Vista32ビットとして参考にしていただけます重複した領域の全対応するためのuriは各複製)を背景に、最初に現れます。これによって6,000,000Urlにこの特定のファイルは、以下の形式のUrlを明らかになスペースしか出なければいけなかったことがない十分な投稿がここに投稿する多くのライブUrl):
http://www.exampleurl.com/something.php http://exampleurl.com/somethingelse.htm http://exampleurl2.com/another-url http://www.exampleurl2.com/a-url.htm http://exampleurl2.com/yet-another-url.html http://exampleurl.com/ http://www.exampleurl3.com/here_is_a_url http://www.exampleurl5.com/something
どのような解決には、出力ファイルを使用上の入力できます:
http://www.exampleurl.com/something.php http://exampleurl2.com/another-url http://www.exampleurl3.com/here_is_a_url http://www.exampleurl5.com/something
ご通知がな重複領域を今に残最初の発生でした。
れば誰でも教えてくれるので助かりますかどうかを正規表現やプログラムいう意識しています。
いということになっての利用経験のないWindows OSので、溶液に伴うもの以外のwindowsプログラムが、ちょっとした"赤ちゃんステッピング"で話せば、どなたでもない).
解決
Pythonで正規表現、非常に生とサブドメインでは動作しません。基本的なコンセプトは、キーは、ドメイン名になり、キーがすでに存在する場合、値は上書きされます、辞書のキーと値を使用することです。
import re
pattern = re.compile(r'(http://?)(w*)(\.*)(\w*)(\.)(\w*)')
urlsFile = open("urlsin.txt", "r")
outFile = open("outurls.txt", "w")
urlsDict = {}
for linein in urlsFile.readlines():
match = pattern.search(linein)
url = match.groups()
domain = url[3]
urlsDict[domain] = linein
outFile.write("".join(urlsDict.values()))
urlsFile.close()
outFile.close()
あなたは、サブドメインをフィルタリングするためにそれを拡張することができますが、基本的な考え方は、私が考えてあります。そして600万URLにかなり時間がかかることがありますPythonで...
Aに直面一部の人々は、 問題は、私は、私が使用します知っている」と思います 正規表現。」今、彼らが持っています 二つの問題。 --Jamie Zawinski、中 comp.emacs.xemacs
他のヒント
この特定の状況で私は使用しないでRegex.URLは特定の形式が存在し、使いやすいパーサによる形式のBCL:の Uri
タイプです。使用でき簡単に構文の型にドメイン情報を求めている.
ここには、迅速例
public List<string> GetUrlWithUniqueDomain(string file) {
using ( var reader = new StreamReader(file) ) {
var list = new List<string>();
var found = new HashSet<string>();
var line = reader.ReadLine();
while (line != null) {
Uri uri;
if ( Uri.TryCreate(line, UriKind.Absolute, out uri) && found.Add(uri.Host)) {
list.Add(line);
}
line = reader.ReadLine();
}
}
return list;
}
私の組み合わせを使用Perl、regexps.私の最初のバージョンi
use warnings ;
use strict ;
my %seen ;
while (<>) {
if ( m{ // ( .*? ) / }x ) {
my $dom = $1 ;
print unless $seen {$dom} ++ ;
print "$dom\n" ;
} else {
print "Unrecognised line: $_" ;
}
}
この扱いwww.exampleurl.com やexampleurl.com て異なります。私の2ndバージョン
if ( m{ // (?:www\.)? ( .*? ) / }x )
を無視する"www."です。ではありません磨きを正規表現のビットが、それは左のリーダー.
最後までコメント正規表現のビットの /x
予選できます。でも人によりを持っていないことを付与することができるとともにデフォルト値が設定され.
if ( m{
// # match double slash
(?:www\.)? # ignore www
( # start capture
.*? # anything but not greedy
) # end capture
/ # match /
}x ) {
使ってい m{}
よ //
回避 /\/\/
- 見unixボックスだって、cygwin
- 利用tr変換'.'をタブに便利です。
- 利用並べ替え(1)の並べ替えラインのドメイン名の一部です。これはちょっと楽にするawkプログラムを正常化wwwす。
とça vaのdupsます。利用にも使用uniq(1)を見dublicates.
(追加:ができないのはなぜで正規表現だけです。コンピュータ科学系の学生を考えるべきであると思い、揚水lemmas.)