我有多个文本,每个文本可能包含对一个或多个网络链接的引用。例如:
text1= "s@1212a as www.abcd.com asasa11".
如何提取:
"www.abcd.com"
从R中的这个文字?换句话说,我希望提取以www
开头并以.com
答案 0 :(得分:10)
regmatches 此方法使用regexpr
/ grepgexpr
和regmatches
。我扩展了测试数据以包含更多示例。
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解决方案的包装器。