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

问题描述 投票:0回答:1

我有数百个TXT文件,其中包含许多内容和一些下载链接。

下载链接的模式如下:

开始于: http://

结尾: .nc

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

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

基于Stackoverflow中的此主题,我试图从文本文件中提取所有下载链接:

Extract websites links from a text in R

这是我的代码:

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

但是它也返回所有行,而我只想提取以.nc结尾的http链接

这里是结果:

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 $0).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"   

我的代码有什么错误?

任何评论将不胜感激。

r regex gsub readlines
1个回答
1
投票

gsub()不是用于提取的,这就是您的代码的问题。用于替换。 (请参见help("gsub"))。为了演示的目的,我将使用以下数据:

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

((通常,我不会下载链接中发布的数据。大多数其他人也不会。如果要共享示例数据,最好在问题中加入dput()的输出来实现) )。

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

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

看起来很熟悉。这里发生的是gsub()查看x的每个元素,并将pattern的每个出现都替换为replacement,在这种情况下是其本身。通过这种方法,您将始终获得完全相同的字符向量。

我建议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"
© www.soinside.com 2019 - 2024. All rights reserved.