这两行代码有什么错误?获取模式:"http:// blabla .nc"

What is the mistake in this two lines of code? Getting pattern: "http:// blabla .nc"

我有数百个 TXT 文件,其中包含很多东西和一些下载 links。

下载link的模式是这样的:

开始于: http://

结束于:.nc

为方便起见,我创建了一个示例文本文件,您可以从此 link 下载:

https://www.dropbox.com/s/5crmleli2ppa1rm/textfile_including_https.txt?dl=1

基于 Whosebug 中的这个主题,我尝试从文本文件中提取所有下载 links:

Extract websites links from a text in R

这是我的代码:

download_links <- readLines(file.choose())
All_my_links <- gsub(download_links, pattern=".*(http://.*nc).*", replace="\1")

但它 returns 所有行,而我只想提取以 .nc

结尾的 http links

结果如下:

head(All_my_links )
tail(All_my_links )

> head(All_my_links )

[1] "#!/bin/bash"                                                                                                                                                                              
[2] "##############################################################################"                                                                                                           
[3] "version=1.3.2"                                                                                                                                                                            
[4] "CACHE_FILE=.$(basename [=12=]).status"                                                                                                                                                        
[5] "openId="                                                                                                                                                                                  
[6] "search_url='https://esgf-node.llnl.gov/esg-search/wget/?distrib=false&dataset_id=CMIP6.HighResMIP.MIROC.NICAM16-9S.highresSST-present.r1i1p1f1.day.pr.gr.v20190830|esgf-data2.diasjp.net'"

> tail(All_my_links )

[1] "MYPROXY_STATUS=$HOME/.MyProxyLogon"                                 
[2] "COOKIE_JAR=$ESG_HOME/cookies"                                       
[3] "MYPROXY_GETCERT=$ESG_HOME/getcert.jar"                              
[4] "CERT_EXPIRATION_WARNING=$((60 * 60 * 8))   #Eight hour (in seconds)"
[5] ""                                                                   
[6] "WGET_TRUSTED_CERTIFICATES=$ESG_HOME/certificates"   

我的代码有什么错误?

如有任何意见,我们将不胜感激。

gsub() 不是用来提取的,那是你的代码有问题。是用来换的(参见 help("gsub"))。出于演示目的,我将使用以下数据:

x <- c("abc", "123", "http://site.nc")

(通常,我不会下载此处发布的数据作为 link。大多数其他人也不会。如果您想共享示例数据,最好将其包含在您的质疑 dput()).

的输出

让我们看看您的 gsub() 方法会发生什么:

gsub(pattern = ".*(http://.*nc).*", replacement = "\1", x = x)
# [1] "abc"            "123"            "http://site.nc"

看起来很眼熟。这里发生的事情是 gsub() 查看 x 的每个元素,并用 replacement 替换每个出现的 pattern,在本例中就是它本身。使用这种方法,您将始终得到完全相同的字符向量。

我建议 stringr::str_extract():

stringr::str_extract(string = x, pattern = ".*http://.*nc.*")
# [1] NA               NA               "http://site.nc"

如果你把它包装在 na.omit() 中,它会给你我认为你想要的输出:

na.omit(stringr::str_extract(string = x, pattern = ".*http://.*nc.*"))
# [1] "http://site.nc"