2017-08-01 51 views
0

我正在寻找只提取视频id字符串从一列youtube链接。从url中提取youtube视频ID与R stringr正则表达式

我目前使用的stringr功能是这样的:

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

这适用于与后出现的URL的末尾号最标准的YouTube链接等号(=)即

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 

所以任何人都可以HEL在上面的所有示例中,我用R regex模式提取id(在这种情况下为kFF0v0FQzEI)?

我见过其他语言中使用的正则表达式模式的例子,但我不确定如何转换为R合规性。

谢谢!

+1

[JavaScript的正则表达式?:我如何从一个URL的YouTube视频ID]的可能的复制(https://stackoverflow.com/questions/3452546/javascript-regex-how-do-i-get -the-youtube-video-id-from-a-url) –

+0

我想你可以在这里找到堆栈溢出的正则表达式。如果你陷入了R的那一部分,那么回到一个更有针对性的问题。 –

回答

0

您可以使用类似下面的内容,但请注意,它对您提供的示例有相当严格的硬编码。

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" 
+0

完美,谢谢! –

+0

@PaulCampbell不客气;很高兴它解决了 – brittenb

相关问题