2013-03-24 29 views
5

tôi đang cố gắng để làm sạch và loại bỏ các thư mục từ một danh sách các URL trong RTháo cuối của một chuỗi URL trong R

Những gì tôi có:

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

Những gì tôi muốn:

domain.com 
sub.domain1.com 
domain2.com 

tôi có một cách hơi dài để làm sạch đầu của 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) 

(Vui lòng cho tôi biết nếu có cách đơn giản hơn để xóa http: // và www. quá.)

Bây giờ tôi đang gặp sự cố với regex và xóa mọi thứ sau / ở cuối. Tôi đã thử này

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

Nhưng nó chỉ là loại bỏ tất cả mọi thứ / và không đặt phía sau.

Cảm ơn trước sự giúp đỡ của bạn!

+0

Hãy thử sử dụng "\/*" (có một dấu chéo ngược trong đó). Tôi nghĩ rằng dấu gạch chéo nên được thoát. Xem có hiệu quả không. – feralin

+0

Tôi đã thử điều đó nhưng nó cho tôi lỗi này> cleanurl3 <- gsub ("\/*", "", cleanurl2) Lỗi: '\ /' là lối thoát không xác định trong chuỗi ký tự bắt đầu "\ /" – NicoM

+1

Biểu thức thứ hai của bạn không loại bỏ dấu gạch chéo, vì '/ *' khớp với bất kỳ số ký tự '/' nào. Thay vào đó, bạn muốn '/.*'. –

Trả lời

5

I tiếp cận với một/gsub kết hợp strsplit (không chỉ gsub b/c đôi khi quá nhanh để tìm ra strsplit vì nó là rất trực quan):

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" 

Sửa
Hoặc nếu bạn muốn chỉ cần sử dụng strsplit (theo đề nghị của Matthew):

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

(+1) Cảm ơn bạn đã thể hiện sức mạnh của những biểu thức chính quy của R, tôi nhận ra rằng tôi có thể cải thiện một số mã của mình khá nhiều với những điều kiện tốt đẹp, v.v. –

+0

Câu trả lời chỉ dành cho strsplit mới không loại bỏ 'www. '. Làm thế nào về: 'sapply (strsplit (x," (// | /) (www [.])? ")," [", 2)' –

+0

Cuộc gọi tốt tôi sẽ thêm nó theo đề xuất của bạn. Tôi đã không thực sự thử nghiệm của tôi. Nên có :) –

1

này nên làm việc:

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

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

Có hoạt động! Cảm ơn bạn! Tôi có một câu hỏi, tại sao bạn sử dụng "["? Tôi không thể thấy nó phù hợp như thế nào. – NicoM

+0

Đó là một lối tắt để lập chỉ mục là '[' thực sự là một hàm của các loại. –

+2

'' ["' là hàm được dùng bởi 'sapply'. Hàm 'strplit' trả về một danh sách, và với' sapply' chúng ta trích xuất các phần tử đầu tiên của các thành phần danh sách (1 là đối số cho "["), do đó có thể thực hiện tương tự bằng 'x <-strsplit (cleanurl2,"/"); c (x [[1]] [1], x [[2]] [1], x [[3]] [1])' –

4

Đối với người đầu tiên:

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

Chỉ cần các lĩnh vực:

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

Xin cảm ơn! Điều này làm cho nó đơn giản hơn rất nhiều. – NicoM

+0

Có thể thay đổi "^ http:" thành "^ https ?:" hoặc thậm chí tổng quát thành "^ [^ /] +:" để nhận ftp, v.v. Ngoài ra, "phụ" hoạt động cũng như "gsub" tại đây (cả hai được vectơ hóa). – igelkott

+0

@igelkott trên gsub-> phụ, tất nhiên là có. Trong thực tế, tôi sẽ chỉnh sửa. –

Các vấn đề liên quan