Skip to main content
 首页 » 编程设计

python之使用 RegEx 从字符串中获取 YouTube 视频 url 或 YouTube 视频 ID

2025年05月04日19落叶无声

所以我一直坚持这个大约一个小时左右,我就是无法让它工作。到目前为止,我一直在尝试从字符串中提取整个链接,但现在我觉得只获取视频 ID 可能更容易。

RegEx 需要从以下链接样式中获取 ID/URL,无论它们在字符串中的什么位置:

http://youtube.com/watch?v=iwGFalTRHDA 
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related 
https://youtube.com/iwGFalTRHDA 
http://youtu.be/n17B_uFF4cA 
youtube.com/iwGFalTRHDA 
youtube.com/n17B_uFF4cA 
http://www.youtube.com/embed/watch?feature=player_embedded&v=r5nB9u4jjy4 
http://www.youtube.com/watch?v=t-ZRX8984sc 
http://youtu.be/t-ZRX8984sc 

到目前为止,我有这个正则表达式:

((http(s)?\:\/\/)?(www\.)?(youtube|youtu)((\.com|\.be)\/)(watch\?v=)?([0-z]{11}|[0-z]{4}(\-|\_)[0-z]{4}|.(\-|\_)[0-z]{9})) 

这会捕获链接,但它也会将链接分解为多个部分,并将其也添加到列表中,因此如果字符串包含单个 youtube 链接,则打印列表时的输出如下所示:

('https://www.youtube.com/watch?v=Idn7ODPMhFY', 'https://', 's', 'www.', 'youtube', '.com/', '.com', 'watch?v=', 'Idn7ODPMhFY', '', '') 

我需要列表只包含链接本身,或者只包含视频 ID(这样更可取)。我真的已经尝试自己做了很长一段时间了,但我就是想不通。我想知道是否有人可以为我整理正则表达式并告诉我哪里出错了,这样我以后就不会再遇到这个问题了?

请您参考如下方法:

与其编写可能并非在所有情况下都有效的复杂正则表达式,不如使用工具来分析 url,例如 urllib:

from urllib.parse import urlparse, parse_qs 
 
url = 'http://youtube.com/watch?v=iwGFalTRHDA' 
 
def get_id(url): 
    u_pars = urlparse(url) 
    quer_v = parse_qs(u_pars.query).get('v') 
    if quer_v: 
        return quer_v[0] 
    pth = u_pars.path.split('/') 
    if pth: 
        return pth[-1] 

如果两次尝试都失败,此函数将返回 None。

我用示例 url 测试了它:

>>> get_id('http://youtube.com/watch?v=iwGFalTRHDA') 
'iwGFalTRHDA' 
>>> get_id('http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related') 
'iwGFalTRHDA' 
>>> get_id('https://youtube.com/iwGFalTRHDA') 
'iwGFalTRHDA' 
>>> get_id('http://youtu.be/n17B_uFF4cA') 
'n17B_uFF4cA' 
>>> get_id('youtube.com/iwGFalTRHDA') 
'iwGFalTRHDA' 
>>> get_id('youtube.com/n17B_uFF4cA') 
'n17B_uFF4cA' 
>>> get_id('http://www.youtube.com/embed/watch?feature=player_embedded&v=r5nB9u4jjy4') 
'r5nB9u4jjy4' 
>>> get_id('http://www.youtube.com/watch?v=t-ZRX8984sc') 
't-ZRX8984sc' 
>>> get_id('http://youtu.be/t-ZRX8984sc') 
't-ZRX8984sc'