是否有正则表达式在两个正斜杠之间和特定字符串之后找到一个字符串? [R]

问题描述 投票:2回答:5

我有一个包含URls的列的数据框,如下所示:

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

我试图只将此列的nameofpage部分提取到一个新列中。我无法弄清楚如何在那个确切的位置提取字符串。该字符串有时包含文字“。”,文本和数字。

我一直试图使用来自tidyr的strsplitseparate,但收效甚微。

tidyr代码如下所示:

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

但是,这根本不起作用。

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

r regex regex-lookarounds
5个回答
1
投票

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

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

2
投票

你可以使用str_split包中的stringr

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"

1
投票

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

get.nameofpage = function(string){
  (unlist(strsplit(string, "\\/")))[4]
}

# Example
my.string = "https://www.facebook.com/nameofpage/posts/13142894231"
> get.nameofpage(my.string)
[1] "nameofpage"

0
投票

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

link <- "https://www.facebook.com/nameofpage/posts/13142894231"

gsub("^.*\\.com/([^/]+).*", "\\1", link)
[1] "nameofpage"

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


0
投票

关于我们对所需字段的位置的确切知识存在一些疑问,但如果我们知道它是第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)
© www.soinside.com 2019 - 2024. All rights reserved.