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

时间:2019-03-30 22:17:35

标签: r regex regex-lookarounds

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

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

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

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

tidyr代码如下:

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

但是,这根本不起作用。

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

5 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

答案 2 :(得分: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"

答案 3 :(得分:0)

您可以使用const delayBlocking = 50。这会在.com之后返回至少一个<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>Document</title> </head> <body> <a id="block" href="#">Block</a> <div id="statusMessage"></div> <button>Click me!</button> <script> document.getElementById('block') .addEventListener('click', doBlock); function doBlock(event) { setStatus('Blocking...'); // Introducing some ... const delayBlocking = 0; setTimeout(function() { sleep(5000); setStatus('Done'); }, delayBlocking); } function sleep(milliseconds) { const start = Date.now(); while ((Date.now() - start) < milliseconds); } function setStatus(status) { document.getElementById('statusMessage') .textContent = status; } </script> </body> </html> 字符,该字符不是正斜杠gsub

+

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

答案 4 :(得分: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)目录名/地下室如果我们知道所需字段是过去的第三字段,则可以使用dirnamebasename

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

注意

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