【问题标题】:What is the mistake in this two lines of code? Getting pattern: "http:// blabla .nc"这两行代码的错误是什么?获取模式:“http://blabla .nc”
【发布时间】:2020-02-05 06:28:30
【问题描述】:

我有数百个 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"   

我的代码有什么错误?

任何评论将不胜感激。

【问题讨论】:

  • 我好几天都在跟踪这样一个神秘的东西。直到我发现一些隐藏的角色把它炸毁了。只是一个想法。
  • 您的代码没有问题。您只是没有任何匹配的数据。
  • 感谢你们两位的cmets。实际上,我在文本文件中有匹配的数据。但是,它仍然无法正常工作。

标签: r regex gsub readlines


【解决方案1】:

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

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

(通常,我不会下载此处作为链接发布的数据。大多数其他人也不会。如果您想共享示例数据,最好在您的问题中包含@987654324 的输出@)。

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

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

看起来很眼熟。这里发生的事情是gsub() 查看x 的每个元素,并将pattern 的每个出现替换为replacement,在这种情况下,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"

【讨论】:

  • 谢谢,如果在每一行你只有一个链接。但是可以说你的字符串是这样的:x &lt;- c("abc", "123", "pr_day_MRI-AGCM http://site.nc")。然后,如果你运行代码:na.omit(stringr::str_extract(string = x, pattern = ".*http://.*nc.*")),你会得到一个像这样的混乱结果:[1] "pr_day_MRI-AGCM http://site.nc"。那么,我们如何去除每一行中多余的字符呢?例如,pr_day_MRI-AGCM 在结果中。
  • 我得到了答案。非常感谢你。只需从 pattern = ".*http://.*nc.*" 中删除 .* 即可。
猜你喜欢
  • 1970-01-01
  • 2012-09-29
  • 2011-10-07
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多