如何根据某些条件在 R 中使用正则表达式提取 URL?

How to extract URLs using regex in R based on some criteria?

我需要从我使用 rvest

提取的问题底部列出的 URL 列表中提取一些特定的 URL

但是,我只需要提取以下

之一开头的URL

并包含以下单词之一(不区分大小写)

但不是当 URL 以 /files/ 开头时必须只包含 data-for-researchers/

我正在使用 R;所以我用 rvest 来提取数据:

代码

url %>%
        html_nodes("a") %>% html_attr("href") %>%
        str_subset(regex("^//*(assets|data|files).*((Primary|Elem|Midd|High)|(data-for-researchers))", ignore_case = T))

这在大部分情况下都有效——即它几乎提取了我需要的所有 URL,但它从 [=24] 开头的 URL 中给了我一些额外的=].

示例 - 正则表达式工作的地方

[1] "https://www.ed.sc.gov/assets/reportCards/2008/documents/Primary_School_Performance_File_2008.xls"                     
 [2] "https://www.ed.sc.gov/assets/reportCards/2008/documents/Primary_School_Fact_File_2008.xls"                            
 [3] "https://www.ed.sc.gov/assets/reportCards/2008/documents/2008-ELEM-Schools-Performance-Data.xls"                       
 [4] "https://www.ed.sc.gov/assets/reportCards/2008/documents/Elementary_School_Fact_File_2008.xls"                         
 [5] "https://www.ed.sc.gov/assets/reportCards/2008/documents/2008-MIDDLE-Schools-Performance-Data.xls"                     
 [6] "https://www.ed.sc.gov/assets/reportCards/2008/documents/Middle_School_Fact_File_2008.xls"                             

代码无效的地方

/files/2018/data-files/high-school-ela-math-results/                                
/files/2018/data-files/elementary-middle-ela-math-results/                          
/files/2018/data-files/2018-report-card-data-for-researchers/                       
/files/2018/data-files/2018-report-card-data-for-researchers-additional-information/

但我只想要此列表中的第 3 个,同时使用上面的代码保留我与其他列表匹配的所有其他列表。

我尝试了很多正则表达式模式的变体,但它大多只从上面删除了底部的 2 个。

我该如何解决这个问题?

数据

我将 link 添加到我放置所有数据 dput 的文件中,因为列表太长 post。可以下载here

我不知道你是否可以在正则表达式中做一个条件。所以我建议分两步完成这一步并合并列表。

most_data <-
    url %>%
    html_nodes("a") %>% html_attr("href") %>%
    str_subset(regex("^//*(assets|data).*((Primary|Elem|Midd|High)|(data-for-researchers))", ignore_case = T))

remaining_data <-
    url %>%
    html_nodes("a") %>% html_attr("href") %>%
    str_subset(regex("^//*files.*((Primary|Elem|Midd|High)|(data-for-researchers))", ignore_case = T))

all_data <- c(most_data, remaining_data)

您可能需要根据您的数据更新以上内容。但我希望一般方法有意义。

您可以使用:

library(rvest)
library(stringr)

url %>%
  html_nodes("a") %>% html_attr("href") %>%
  str_subset(regex('(assets/|data/).*((Primary|Elem|Midd|High))|(files.*data-for-researchers/)', ignore_case = TRUE))

或者在 base R 中使用 grep :

grep('(assets/|data/).*((Primary|Elem|Midd|High))|(files.*data-for-researchers/)',
     x, value = TRUE, ignore.case = TRUE)

其中 x 是字符串。