2013-03-24 17 views
5

Próbuję oczyścić i usunąć katalogi z listy adresów URL w RUsuń końcu adresu URL w R

Co mam:

http://domain.com/123 
http://www.sub.domain1.com/222 
http://www.domain2.com/1233/abc 

Czego chcę:

domain.com 
sub.domain1.com 
domain2.com 

mam nieco długą drogę do czystej początek URL

url <- c("http://domain.com/123", "http://www.sub.domain1.com/222","http://www.domain2.com/1233/abc" 

cleanurl <- gsub("http://","",url) 
cleanurl2 <- gsub("www.","",cleanurl) 

(Proszę dać mi znać, jeśli istnieje prostszy sposób czyszczenia http: // i www. też.)

Teraz mam problemy z regex i usunięcie wszystkiego po / na końcu. Próbowałem to

cleanurl3 <- gsub("/*","",cleanurl2) 

Ale to jest po prostu usunięcie wszystkiego po nim / i nie.

Z góry dziękuję za pomoc!

+0

Spróbuj użyć "\/*" (tam backsleshem tam). Myślę, że należy uciec przed ciosem. Sprawdź, czy to działa. – feralin

+0

Próbowałem, ale daje mi ten błąd> cleanurl3 <- gsub ("\/*", "", cleanurl2) Błąd: "\ /" jest nierozpoznanym ucieczką w ciągu znaków zaczynającym się "\ /" – NicoM

+1

Twoje drugie wyrażenie nie usuwa slasha, ponieważ '/ *' pasuje do dowolnej liczby znaków '/'. Zamiast tego chcesz '/.*'. –

Odpowiedz

5

podejście í jest z strsplit/gsub kombi (nie tylko gsub b/c czasami jest tak szybko, aby dowiedzieć się strsplit ponieważ jest bardzo intuicyjny):

x <- readLines(n=3) 
http://domain.com/123 
http://www.sub.domain1.com/222 
http://www.domain2.com/1233/abc 

gsub("www.", "", sapply(strsplit(x, "//|/"), "[", 2)) 

## > gsub("www.", "", sapply(strsplit(x, "//|/"), "[", 2)) 
## [1] "domain.com"  "sub.domain1.com" "domain2.com" 

Edit
Albo jeśli chcesz po prostu użyć strsplit (za sugestią Mateusza):

sapply(strsplit(x, "(//|/)(www[.])?"), "[", 2) 
+0

(+1) Dzięki za pokazanie mocy wyrażeń regularnych R, właśnie zdałem sobie sprawę, że mogę poprawić niektóre z moich kodów całkiem z tymi fajnymi warunkami. –

+0

Nowa odpowiedź typu "strsplit-only" nie usuwa 'www. '. Co powiesz na to: 'sapply (strsplit (x," (// | /) (www [.])? ")," [", 2)' –

+0

Dobre połączenie Dodaję to zgodnie z twoją sugestią. Właściwie to nie wypróbowałem mojego rozwiązania. Powinien mieć :) –

1

To powinno działać:

cleanurl <- gsub("http://","",url) 
cleanurl2 <- gsub("www.","",cleanurl) 

sapply(strsplit(cleanurl2,"/"),"[",1) 
[1] "domain.com"  "sub.domain1.com" 
[3] "domain2.com" 
+0

Tak, zadziałało! Dziękuję Ci! Mam jedno pytanie, dlaczego użyłeś "["? Nie widzę, jak to pasuje. – NicoM

+0

To skrót do indeksowania, ponieważ '[' jest właściwie funkcją sortowania. –

+2

'' "[" 'jest funkcją używaną przez' sapply'. Funkcja 'strplit' zwraca listę, a przy' sapply' wyodrębniamy pierwsze elementy z elementów listy (1 jest argumentem dla "["), więc to samo można by zrobić ręcznie przez 'x <-strsplit (cleanurl2,"/"); c (x [[1]] [1], x [[2]] [1], x [[3]] [1])' –

4

Na pierwszy:

cleanurl <- sub("^http://(?:www[.])?(.*)$", "\\1", url) 
cleanurl 
## [1] "domain.com/123"  "sub.domain1.com/222" "domain2.com/1233/abc" 

tylko domen:

cleanurl <- sub("^http://(?:www[.])?([^/]*).*$", "\\1", url) 
cleanurl 
## [1] "domain.com"  "sub.domain1.com" "domain2.com" 
+0

Wielkie dzięki! To sprawia, że ​​jest o wiele prostsze. – NicoM

+0

Można zmienić "^ http:" na "^ https ?:" lub nawet uogólnić na "^ [^ /] +:", aby uzyskać ftp, itp. Również "pod" działa tak samo jak "gsub" tutaj (zarówno są wektoryzowane). – igelkott

+0

@igelkott na gsub-> sub, tak oczywiście. W rzeczywistości będę edytować. –

Powiązane problemy