如果模式不同,则从字符串中提取子字符串

时间:2018-06-01 10:25:43

标签: r regex web-scraping substring stringr

我想使用 substr()从网络链接中提取名称。我的问题是模式略有不同,所以我不知道如何解释差异。这是一个示例:

INPUT:

state = {
    allGenres: [
      {
        id: 1,
        genreTitle: 'Horror',
        isSelected: false,
      }
    ]
  }

我想要的输出

list <- c("https://www.gatcoin.io/wp-content/uploads/2017/08/GATCOIN-Whitepaper_ENG-1.pdf",
"https://appcoins.io/pdf/appcoins_whitepaper.pdf",
"https://pareto.network/download/Pareto-Technical-White-Paper.pdf",
"http://betbox.ai/BetBoxBizWhitepaper.pdf",
"https://www.aidcoin.co/assets/documents/whitepaper.pdf")

根据我的理解,我需要指定要提取的字符串的开头和结尾,但有时会以“https://”开头,而有时则为“https://www”。

我怎么能解决这个问题?

4 个答案:

答案 0 :(得分:2)

您可以使用stringr ...

轻松完成此操作
library(stringr)

str_match(list, "\\/(www\\.)*(\\w+)\\.")[,3]

[1] "gatcoin"  "appcoins" "pareto"   "betbox"   "aidcoin" 

正则表达式提取斜杠和可选www.之间的第一个字母序列,以及下一个点。

基数R中的等价物略显混乱......

sub(".+?\\/(?:www\\.)*(\\w+)\\..+", "\\1", list)

这也会添加字符串的开头和结尾,只用你想要的捕获组替换整个批次。它将可选www.设置为非捕获组,如果找不到第一个组,则substr_match的行为会有所不同。

答案 1 :(得分:1)

list <- c("https://www.gatcoin.io/wp-content/uploads/2017/08/GATCOIN- Whitepaper_ENG-1.pdf", 
          "https://appcoins.io/pdf/appcoins_whitepaper.pdf", 
          "https://pareto.network/download/Pareto-Technical-White-Paper.pdf", 
          "http://betbox.ai/BetBoxBizWhitepaper.pdf", 
          "https://www.aidcoin.co/assets/documents/whitepaper.pdf")
pattern <- c("https://", "www.", "http://")
for(p in pattern) list <- gsub(p, "", list)
unlist(lapply(strsplit(list, "[.]"), function(x) x[1]))
[1] "gatcoin"  "appcoins" "pareto"   "betbox"   "aidcoin" 

答案 2 :(得分:1)

您可以使用Regular Expressions。然而,那就是重新发明轮子。人们已经考虑过如何在使用现有函数之前拆分URL。

例如httr包的parse_url。或谷歌“R解析URL”替代。

urls <- list("https://www.gatcoin.io/wp-content/uploads/2017/08/GATCOIN-Whitepaper_ENG-1.pdf",
"https://appcoins.io/pdf/appcoins_whitepaper.pdf",
"https://pareto.network/download/Pareto-Technical-White-Paper.pdf",
"http://betbox.ai/BetBoxBizWhitepaper.pdf",
"https://www.aidcoin.co/assets/documents/whitepaper.pdf")

使用lapplyparse_url

的每个元素使用urls
 parsed <- lapply(urls, httr::parse_url)

现在您有一个列表列表。列表parsed的每个元素本身都有多个元素,其中包含URL的各个部分。

提取所有元素parsed[[...]]$hostname

hostname <- sapply(parsed, function(e) e$hostname)

按点分割它们并取第二个元素:

domain <- strsplit(hostname, "\\.")
domain <- sapply(domain, function(d) d[length(d)-1])

答案 3 :(得分:0)

此正则表达式捕获://(www.)之后的单词。

(?::\/\/(?:www.)?)(\w+)