我想用字符串替换字符串中的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)
高度赞赏的任何帮助。
答案 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