从R中的文本中提取网站链接

时间:2013-03-22 20:14:59

标签: r

我有多个文本,每个文本可能包含对一个或多个网络链接的引用。例如:

 text1= "s@1212a as www.abcd.com asasa11". 

如何提取:

   "www.abcd.com" 

从R中的这个文字?换句话说,我希望提取以www开头并以.com

结尾的模式

3 个答案:

答案 0 :(得分:10)

regmatches 此方法使用regexpr / grepgexprregmatches。我扩展了测试数据以包含更多示例。

text1 <- c("s@1212a www.abcd.com www.cats.com", 
           "www.boo.com", 
           "asdf",
           "blargwww.test.comasdf")

# Regular expressions take some practice.
# check out ?regex or the wikipedia page on regular expressions
# for more info on creating them yourself.
pattern <- "www\\..*?\\.com"
# Get information about where the pattern matches text1
m <- gregexpr(pattern, text1)
# Extract the matches from text1
regmatches(text1, m)

哪个给出了

> regmatches(text1, m) ##
[[1]]
[1] "www.abcd.com" "www.cats.com"

[[2]]
[1] "www.boo.com"

[[3]]
character(0)

[[4]]
[1] "www.test.com"

注意它会返回一个列表。如果我们想要一个矢量,你可以在结果上使用unlist。这是因为我们使用了gregexpr,这意味着我们的字符串中可能存在多个匹配项。如果我们知道最多只有一个匹配,我们可以使用regexpr代替

> m <- regexpr(pattern, text1)
> regmatches(text1, m)
[1] "www.abcd.com" "www.boo.com"  "www.test.com"

但请注意,这会将所有结果作为向量返回,并且只返回每个字符串的单个结果(请注意,www.cats.com不在结果中)。但总的来说,我认为这两种方法中的任何一种都优于gsub方法,因为如果没有找到结果,这种方式将返回整个输入。例如,看看:

> gsub(text1, pattern=".*(www\\..*?\\.com).*", replace="\\1")
[1] "www.abcd.com" "www.boo.com"  "asdf"         "www.test.com"

即使在修改模式后更加强大,也是如此。我们仍然得到了&#39; asdf&#39;在结果中,即使它显然与模式不匹配。

无耻愚蠢的自我推销:regmatches是在R 2.14中引入的,所以如果你遇到早期版本的R,你可能会失去运气。除非您能够安装future2.14软件包from my github repo,它为2.14中引入的早期版本的R提供了一些支持。

<强> strapplyc 即可。与上述##给出相同结果的替代方案是:

library(gsubfn)
strapplyc(test1, pattern)

正则表达式以下是有关如何破译正则表达式的一些解释:

pattern <- "www\\..*?\\.com"

说明:

www与www部分匹配

\\.我们需要逃避一个真实的“点”。使用\\的字符,因为普通.表示&#34;任何字符&#34;在正则表达式中。

.*? .表示任何字符,*表示匹配0次或更多次,而?后面的*表示不贪得无厌否则&#34; asdf www.cats.com www.dogs.com asdf&#34;将匹配所有&#34; www.cats.com www.dogs.com&#34;作为一个单一的比赛,而不是认识到那里有两个比赛。

\\.我们需要再次转义一个实际的点字符

com此部分与结尾的&#39; com&#39;匹配。我们想要匹配

把它们放在一起它说:从www开始。然后匹配任何字符,直到你到达第一个&#34; .com&#34;

答案 1 :(得分:6)

查看gsub功能:

x = "s@1212a as www.abcd.com asasa11"
gsub(x=x, pattern=".*(www.*com).*", replace="\\1")

基本思想是将要保留在括号中的txt包围起来,然后用它替换整行。 gsub“\\ 1”的替换参数是指在括号中找到的内容。

答案 2 :(得分:2)

这里的解决方案很棒且基础很好。对于那些想要快速解决方案的人,您可以使用qdap的{​​{1}}。这个函数基本上采用左和右元素,它将提取其间的所有内容。通过设置genXtract,它将包含以下元素:

with = TRUE

如果您查看函数的代码,那么它是Dason解决方案的包装器。