如何根据一些标准在R中使用正则表达式提取URL?

如何根据一些标准在R中使用正则表达式提取URL?,r,regex,rvest,R,Regex,Rvest,我需要从我使用rvest 但是,我只需要提取以下URL之一开头的URL /assets/ /data /files/ 并包含以下单词之一(不区分大小写) primary elem midd high 但是,当URL以/files/开头时,就不需要了,因为该URL必须只包含供研究人员使用的数据 我用的是R;因此,我使用rvest提取数据: 代码 url %>% html_nodes("a") %>% html_attr("href") %>%

我需要从我使用
rvest

但是,我只需要提取以下URL之一开头的URL

  • /assets/
  • /data
  • /files/
并包含以下单词之一(不区分大小写)

  • primary
  • elem
  • midd
  • high
但是,当URL以
/files/
开头时,就不需要了,因为该URL必须只包含供研究人员使用的
数据

我用的是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,但它从以
\files\
开头的URL中提供了一些额外的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/
但是我只想要这个列表中的第三个,同时保留我使用上面代码匹配的所有其他的

我尝试了很多regex模式的变体,但它大多只删除了上面的底部2

我怎样才能解决这个问题

数据


我正在将链接添加到文件中,我将所有数据的
dput
,因为列表太长,无法发布。它可以下载

我不知道你是否可以在正则表达式中使用条件语句。因此,我建议分两步完成这一步骤,并将列表合并

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)
most_数据%
html_节点(“a”)%%>%html_属性(“href”)%%>%
str|u子集(regex(“^/*(资产数据)。*((主要元素中高)(研究人员数据))”,忽略案例=T)
剩余数据%
html_节点(“a”)%%>%html_属性(“href”)%%>%
str|u子集(regex(“^/*文件”。((主要|元素|中间|高)|(研究人员数据))”,忽略| case=T))

所有的数据我不知道你是否能在正则表达式中做条件运算。因此,我建议分两步完成这一步骤,并将列表合并

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)
most_数据%
html_节点(“a”)%%>%html_属性(“href”)%%>%
str|u子集(regex(“^/*(资产数据)。*((主要元素中高)(研究人员数据))”,忽略案例=T)
剩余数据%
html_节点(“a”)%%>%html_属性(“href”)%%>%
str|u子集(regex(“^/*文件”。((主要|元素|中间|高)|(研究人员数据))”,忽略| case=T))
所有数据都可以使用:

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
是字符串

您可以使用:

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
是字符串

太棒了!我知道我在哪里犯了错误。谢谢太棒了!我知道我在哪里犯了错误。谢谢