使用 R stringr 正则表达式从 url 中提取 youtube 视频 ID

Extract youtube video ID from url with R stringr regex

我只想从 YouTube 链接列中提取视频 ID 字符串。

我目前使用的stringr函数是这样的:

str_extract(data$link, "\b[^=]+$")

这适用于大多数标准的 YouTube 链接,其 ID 在 url 末尾出现在 = 符号之后,即

youtube.com/watch?v=kFF0v0FQzEI

但并非所有链接都遵循此模式,示例:

youtube.com/v/kFF0v0FQzEI
youtube.com/vi/kFF0v0FQzEI
youtu.be/kFF0v0FQzEI
www.youtube.com/v/kFF0v0FQzEI?feature=autoshare&version=3&autohide=1&autoplay=1
www.youtube.com/watch?v=kFF0v0FQzEI&list=PLuV2ACKGzAMsG-pem75yNYhBvXZcl-mj_&index=1

那么谁能帮助我使用 R 正则表达式模式来提取上述所有示例中的 ID(在本例中为 kFF0v0FQzEI)?

我看过其他语言中用于执行此操作的正则表达式模式示例,但我不确定如何转换为 R 合规性。

谢谢!

您可以使用类似以下内容的内容,但请注意,它对您提供的示例进行了大量硬编码。

links = c("youtube.com/v/kFF0v0FQzEI", 
          "youtube.com/vi/kFF0v0FQzEI", 
          "youtu.be/kFF0v0FQzEI", 
          "www.youtube.com/v/kFF0v0FQzEI?feature=autoshare&version=3&autohide=1&autoplay=1", 
          "www.youtube.com/watch?v=kFF0v0FQzEI&list=PLuV2ACKGzAMsG-pem75yNYhBvXZcl-mj_&index=1", 
          "youtube.com/watch?v=kFF0v0FQzEI", 
          "http://www.youtube.com/watch?argv=xyz&v=kFF0v0FQzEI")

get_id = function(link) {
  if (stringr::str_detect(link, '/watch\?')) {
    rgx = '(?<=\?v=|&v=)[\w]+'
  } else {
    rgx = '(?<=/)[\w]+/?(?:$|\?)'
  }
  stringr::str_extract(link, rgx)
}

ids = unname(sapply(links, get_id))
# [1] "kFF0v0FQzEI"  "kFF0v0FQzEI"  "kFF0v0FQzEI"  "kFF0v0FQzEI?" 
#     "kFF0v0FQzEI"  "kFF0v0FQzEI"  "kFF0v0FQzEI"