使用 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"
我只想从 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"