【问题标题】:Extracting substring from string if pattern varies [duplicate]如果模式不同,则从字符串中提取子字符串[重复]
【发布时间】:2018-06-01 10:25:43
【问题描述】:

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

输入:

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")

我想要的输出

c("gatcoin", "appcoins", "pareto", "betbox", "aidcoin") 

据我了解,我需要指定要提取的字符串的开始和结束,但有时开始会是“https://”,而其他时候会是“https://www”。

我该如何解决这个问题?

【问题讨论】:

  • @smci 你怎么知道 OP 知道正则表达式...?
  • @akraf:我认为 OP 标记了这个正则表达式,并要求有人写一个正则表达式。但不管怎样,任何带有 substr、strsplit 或其他任何东西的尝试代码在哪里? SO 要求用户进行尝试,并且通常会显示一些尝试过的代码
  • @smic:嗯,这是一种鼓励刚开始学习编码语言的用户的方式。此外,不是很有帮助;-)。我不知道regrex,如果这能回答你的疑问。
  • 基于@zx8754的链接:library(urltools); suffix_extract(domain(urls))$domain,其中urls是链接的向量。

标签: r regex web-scraping substring stringr


【解决方案1】:

您可以使用stringr...轻松做到这一点...

library(stringr)

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

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

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

base R 中的等价物稍微有点混乱...

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

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

【讨论】:

    【解决方案2】:
    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" 
    

    【讨论】:

      【解决方案3】:

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

      例如 httr 包的parse_url。或谷歌“R parse 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")
      

      使用lapplyurls 的每个元素使用parse_url

       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])
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-12
          • 1970-01-01
          • 2020-09-15
          • 1970-01-01
          • 1970-01-01
          • 2017-10-19
          • 2017-12-30
          • 2017-09-24
          相关资源
          最近更新 更多