用域(R)替换URL

时间:2013-04-14 20:15:27

标签: regex r

我想用字符串替换字符串中的URL(“Hello world http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example”)(“Hello world stackoverflow.com”)。

到目前为止,我能够通过某个常量值识别和替换URL,但不能通过URL的域识别和替换URL:

x <- "Hello world http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example"

gsub("http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", "URL", x) 

高度赞赏的任何帮助。

5 个答案:

答案 0 :(得分:2)

根据评估网址本身的重要程度,您可能可以使用以下内容:

gsub("(https?://[^/\\s]+)[^\\s]*", "\\1", x)

使用可选http://后跟s作为后引用组1捕获one or more non whitespace and \ characters,然后消耗零或更多non whitespace characters(贪婪)。然后整个匹配将被捕获的组(域)替换。

注意:这假设网址不包含任何空格。

答案 1 :(得分:1)

您需要使用反向引用。

让我先说明我不知道R,但我假设反向引用的语法是\N,其中N是匹配组。

所以如果你替换模式

https?://([^/\s]++)\S*+

通过字符串

\1

您最终应该使用捕获组替换匹配的模式。

我不知道逃避约定是什么,但你可能需要用另一个反斜杠来逃避反斜杠。

细分模式

  • https?匹配“http”后跟可选的“s”
  • ://匹配文字“://”
  • ([^/\s]++)匹配并抓住所有内容,直到下一个斜杠或空格(域名)
  • \S*+匹配网址的其余部分 - 直到下一个空格

答案 2 :(得分:0)

您可以使用grep扫描字符串并提取http://和/之间的所有值 grep -Po 'http://\K.*?(?=/)' 在此处查看http://rfunction.com/archives/1481和正则表达式指南:http://www.regular-expressions.info/

答案 3 :(得分:0)

这里的问题是(与之前的Stackoverflow问题相比)字符串的非URL部分应保留,同时URL应缩短到其域。

根据我的问题中提到的帖子,我知道使用以下解决方案:

x <- "Hello world http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example"

y.1 <- gsub("http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", "", x) 
y.2  <- gsub("www.", "", sapply(strsplit(x, "//|/"), "[", 2))

z <- paste( y.1, y.2, sep="")

z

这不是最优雅的解决方案,但它确实有效。

答案 4 :(得分:0)

    library(httr)
    txt <- "hello world http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible"
    l <- lapply(unlist(strsplit(txt," ",fixed=TRUE)),function(w){
           hostname <- parse_url(w)$hostname
           if(is.null(hostname) ) hostname <- w
           hostname
          })
    paste(l,collapse=" ")
    ## hello world stackoverflow.com