【问题标题】:Is there a regex to find a string between two forward slashes and after a specific string? [R]是否有正则表达式可以在两个正斜杠之间和特定字符串之后查找字符串? [R]
【发布时间】:2019-03-30 22:17:35
【问题描述】:

我有一个数据框,其中有一列包含这样的 URls:

https://www.facebook.com/nameofpage/posts/13142894231

我正在尝试仅将此列的 nameofpage 部分提取到新列中。我无法弄清楚如何在该确切位置提取字符串。字符串有时包含文字“.”、文本和数字。

我一直在尝试使用来自 tidyr 的 strsplitseparate,但效果有限。

tidyr 代码如下所示:

  separate(Link, c(NA, NA, NA, "target"), sep = "/")

但是,这根本不起作用。

我希望将nameofpage 提取到列中,但有时输出实际上是 URL 的另一部分。

【问题讨论】:

  • 您要检查哪个特定字符串?您还可以添加更多示例吗?
  • “在两个正斜杠之间和特定字符串之后” 那么“特定”字符串是什么?
  • 问题是字符串总是不同的。有时它只是文本,有时是带有数字的文本,有时是带有文字“。”的文本。某处,或三者的结合。我只是想获取nameofpage 字符串,所以它总是在“facebook.com/”之后。
  • 另一个类似于 G5W 解决方案的选项,但不止一个元素:sapply(strsplit(c(x, x), split = "/", fixed = TRUE), "[[", 4)

标签: r regex regex-lookarounds


【解决方案1】:

您可以使用 stringr 包中的 str_split

URL = "https://www.facebook.com/nameofpage/posts/13142894231"

library(stringr)

str_split(URL, "/")
[[1]]
[1] "https:"           ""                 "www.facebook.com" "nameofpage"      
[5] "posts"            "13142894231"     

str_split(URL, "/")[[1]][4]
[1] "nameofpage"

【讨论】:

  • 是否有理由使用str_split 而不是基础str.split
【解决方案2】:

此外还有str_match,它将在正则表达式中返回匹配的组:

str_match(url, "://(.*?)/(.*?)(\/|$)")[,2]

【讨论】:

    【解决方案3】:

    您可以编写一个自定义函数来处理您的字符串:

    get.nameofpage = function(string){
      (unlist(strsplit(string, "\\/")))[4]
    }
    
    # Example
    my.string = "https://www.facebook.com/nameofpage/posts/13142894231"
    > get.nameofpage(my.string)
    [1] "nameofpage"
    

    【讨论】:

      【解决方案4】:

      您可以使用gsub。这会在 .com 之后返回至少一个 + 字符,该字符不是正斜杠 [^/]

      link <- "https://www.facebook.com/nameofpage/posts/13142894231"
      
      gsub("^.*\\.com/([^/]+).*", "\\1", link)
      [1] "nameofpage"
      

      注意:这仅适用于带有“.com”的网址(即,它不适用于其他域 .edu、.org 等)

      【讨论】:

      • 仅适用于.com 页面,不适用于任何其他域类型。
      • @42- 非常正确--OP 在上面的评论中说它总是在“facebook.com”之后。为了清楚起见,我会添加一个编辑
      【解决方案5】:

      关于我们对所需字段位置的确切了解存在一些问题,但如果我们知道它是第 4 个 / 分隔字段或倒数第 3 个,我们可以分别使用 (1) 或 (2)。 (如果这些都不能假设,请明确说明我们如何知道需要哪个字段。)

      1) read.table 使用下面注释中的字符向量ss 作为输入,如果我们知道所需的字段在第三个和第四个斜杠之间,我们可以使用read.table

      read.table(text = ss, sep = "/", fill = TRUE, as.is = TRUE)[[4]]
      ## [1] "nameofpage" "nameofpage"
      

      1a) 使用separate

      library(tidyr)
      
      separate(data.frame(ss), ss, c(NA, NA, NA, "target"), sep = "/", extra = "drop")
      ##       target
      ## 1 nameofpage
      ## 2 nameofpage
      

      2) dirname/basement 如果我们知道期望的字段是过去的第三个字段,我们可以使用dirnamebasename

      basename(dirname(dirname(ss)))
      ## [1] "nameofpage" "nameofpage"
      

      注意

      s <- "https://www.facebook.com/nameofpage/posts/13142894231"
      ss <- c(s, s)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        相关资源
        最近更新 更多