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

是否有正则表达式在两个正斜杠之间和特定字符串之后查找字符串?[R],r,regex,regex-lookarounds,R,Regex,Regex Lookarounds,我有一个dataframe,其中有一列包含如下URL: https://www.facebook.com/nameofpage/posts/13142894231 我正在尝试将此列的nameofpage部分提取到一个新列中。我不知道如何在那个确切的位置提取字符串。字符串有时包含文字、文本和数字 我一直在尝试使用strsplit并与tidyr分离,但收效甚微 tidyr代码如下所示: separate(Link, c(NA, NA, NA, "target"), sep = "/") 然而

我有一个dataframe,其中有一列包含如下URL:

https://www.facebook.com/nameofpage/posts/13142894231
我正在尝试将此列的nameofpage部分提取到一个新列中。我不知道如何在那个确切的位置提取字符串。字符串有时包含文字、文本和数字

我一直在尝试使用strsplit并与tidyr分离,但收效甚微

tidyr代码如下所示:

  separate(Link, c(NA, NA, NA, "target"), sep = "/")
然而,这真的根本不起作用

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

您可以使用stringr包中的stru-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_match(url, "://(.*?)/(.*?)(\/|$)")[,2]

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

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

# Example
my.string = "https://www.facebook.com/nameofpage/posts/13142894231"
> get.nameofpage(my.string)
[1] "nameofpage"
你可以使用gsub。这将在.com之后返回至少一个+字符,该字符不是正斜杠[^/]:


注意:这只适用于带有.com的url,也就是说,它不适用于其他域.edu、.org等。

关于我们对所需字段位置的确切了解,存在一些问题,但如果我们知道它是第四个/分隔字段,或者是最后一个字段的第三个,我们可以分别使用1或2。如果以上两项都不能假设,请明确说明我们如何知道需要哪个领域

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

read.table(text = ss, sep = "/", fill = TRUE, as.is = TRUE)[[4]]
## [1] "nameofpage" "nameofpage"
1a使用单独的:

2 dirname/base如果我们知道所需字段是过去的第三个字段,则可以使用dirname和basename:

basename(dirname(dirname(ss)))
## [1] "nameofpage" "nameofpage"
笔记
哪个是要检查的特定字符串?您还可以添加更多示例吗?在两个正斜杠之间和特定字符串之后,那么特定字符串是什么?问题是字符串总是不同的。有时是简单的文本,有时是带数字的文本,有时是带文字的文本。某处,或三者的组合。我只是想获取页面字符串的名称,所以它总是在facebook.com/之后。另一个选项类似于G5W的解决方案,但用于多个元素:sapplystrsplitcx,x,split=/,fixed=TRUE[[,4只适用于.com页面,不适用于任何oterh域类型。@42-非常正确的OP在上面的评论中说,它总是在facebook.com之后出现。为了清晰起见,我将添加一个编辑,但是否有理由使用str_split而不是base str.split?
library(tidyr)

separate(data.frame(ss), ss, c(NA, NA, NA, "target"), sep = "/", extra = "drop")
##       target
## 1 nameofpage
## 2 nameofpage
basename(dirname(dirname(ss)))
## [1] "nameofpage" "nameofpage"
s <- "https://www.facebook.com/nameofpage/posts/13142894231"
ss <- c(s, s)