2017-08-01 2 views
0

Je cherche à extraire uniquement la chaîne d'identification de la vidéo à partir d'une colonne de liens youtube.Extrait l'ID de la vidéo youtube de l'URL avec R stringr regex

La fonction stringr J'utilise actuellement est la suivante:

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

Cela fonctionne pour la plupart des liens standard youtube avec l'identifiant à la fin de l'URL apparaissant après un signe = à-dire

youtube.com/watch?v=kFF0v0FQzEI 

Cependant, tous les liens suivent ce schéma, des exemples:

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 

Alors quelqu'un pourrait-il hel P me sortir avec un motif R regex pour extraire l'id (kFF0v0FQzEI dans ce cas) dans tous les exemples ci-dessus?

J'ai vu des exemples de modèles regex utilisés dans d'autres langages pour ce faire, mais je ne sais pas comment convertir en conformité R.

Merci!

+1

double possible de [JavaScript REGEX: Comment puis-je obtenir l'identifiant vidéo YouTube à partir d'une URL] (https://stackoverflow.com/questions/3452546/javascript-regex-how-do-i-get -the-youtube-video-id-from-a-url) –

+0

Je pense que vous pouvez faire un tour et trouver une regex sur Stack Overflow pour cela. Si vous êtes coincé avec la partie R de cela, revenez avec une question plus ciblée. –

Répondre

0

Vous pourriez utiliser quelque chose comme ce qui suit, mais notez qu'il est assez fortement codé en dur pour les exemples que vous avez fournis.

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

parfait, merci! –

+0

@PaulCampbell De rien; heureux que cela a fonctionné – brittenb