【问题标题】:Python regex convert youtube url to youtube videoPython 正则表达式将 youtube url 转换为 youtube 视频
【发布时间】:2011-06-10 00:16:27
【问题描述】:

我正在制作一个正则表达式,以便可以在用户发布的一段 HTML 文本中找到 youtube 链接(可以是多个)。

目前我正在使用以下正则表达式将“http://www.youtube.com/watch?v=-JyZLS2IhkQ”更改为显示相应的 youtube 视频:

return re.compile('(http(s|):\/\/|)(www.|)youtube.(com|nl)\/watch\?v\=([a-zA-Z0-9-_=]+)').sub(tag, value)

(其中变量“标签”是一些 html,因此视频可以正常工作并“重视”用户帖子)

现在这个工作..直到网址是这样的:

'http://www.youtube.com/watch?v=-JyZLS2IhkQ&feature...'

现在我希望你们能帮助我弄清楚如何匹配“&feature...”部分,使其消失。

示例 HTML:

No replies to this post..

Youtube vid:

http://www.youtube.com/watch?v=-JyZLS2IhkQ

More blabla

感谢您的意见,非常感谢

斯蒂芬

【问题讨论】:

  • 你的正则表达式很糟糕:)
  • 等什么?您是否试图找到隐藏在某些 html 代码中的 youtube 链接?我很难从你的问题中解析出来!
  • 很抱歉这个不好的问题,我改变了帖子,希望现在更清楚了。
  • 关于残暴的正则表达式,如何改进?
  • 您的示例并不是真正的 html,并且您没有告诉我们可以从价值中得到什么。如果 value 是用户提供的,你会遇到各种麻烦。

标签: python regex url youtube


【解决方案1】:

我的解决方法如下:

import re

def youtube_url_validation(url):
    youtube_regex = (
        r'(https?://)?(www\.)?'
        '(youtube|youtu|youtube-nocookie)\.(com|be)/'
        '(watch\?v=|embed/|v/|.+\?v=)?([^&=%\?]{11})')

    youtube_regex_match = re.match(youtube_regex, url)
    if youtube_regex_match:
        return youtube_regex_match

    return youtube_regex_match

测试:

youtube_urls_test = [
    'http://www.youtube.com/watch?v=5Y6HSHwhVlY',
    'http://youtu.be/5Y6HSHwhVlY', 
    'http://www.youtube.com/embed/5Y6HSHwhVlY?rel=0" frameborder="0"',
    'https://www.youtube-nocookie.com/v/5Y6HSHwhVlY?version=3&hl=en_US',
    'http://www.youtube.com/',
    'http://www.youtube.com/?feature=ytca']


for url in youtube_urls_test:
    m = youtube_url_validation(url)
    if m:
        print('OK {}'.format(url))
        print(m.groups())
        print(m.group(6))
    else:
        print('FAIL {}'.format(url))

【讨论】:

  • 为了匹配像http://www.youtube.com/watch?feature=player_detailpage&v=QemTZn8YfJ0#t=46s这样的网址,我将你的正则表达式编辑为youtube_regex = ( r'(https?://)?(www\.)?' '(youtube|youtu|youtube-nocookie)\.(com|be)/' '(watch\?.*?(?=v=)v=|embed/|v/|.+\?v=)?([^&=%\?]{11})')
【解决方案2】:

您应该将正则表达式指定为原始字符串。

您不必转义每个看起来特殊的字符,只需转义的字符。

您可以使用?,而不是指定一个空分支 ((foo|)) 以使某些内容成为可选。

如果你想在字符集中包含-,你必须将它转义或者放在左括号之后。

您可以使用\w(等于[a-zA-Z0-9_])等特殊字符集来缩短您的正则表达式。

r'(https?://)?(www\.)?youtube\.(com|nl)/watch\?v=([-\w]+)'

现在,为了匹配整个 URL,您必须考虑在输入中可以或不可以跟随它的内容。然后你把它放到一个前瞻组中(你不想消耗它)。

在这个例子中,除了-=%& 和字母数字字符之外的所有内容都用于结束 URL(懒得想更多)。

v 参数和 URL 末尾之间的所有内容都被 .*? 非贪婪地消耗。

r'(https?://)?(www\.)?youtube\.(com|nl)/watch\?v=([\w-]+)(&.*?)?(?=[^-\w&=%])'

不过,我不会太相信这个通用解决方案。众所周知,用户输入很难可靠地解析。

【讨论】:

    【解决方案3】:

    如果您使用urlparse module 来挑选您找到的 youtube 地址并将其恢复为您想要的格式怎么办?然后,您可以简化您的正则表达式,使其仅找到整个 url,然后使用 urlparse 为您完成繁重的挑选工作。

    from urlparse import urlparse,parse_qs,urlunparse
    from urllib import urlencode
    youtube_url = urlparse('http://www.youtube.com/watch?v=aFNzk7TVUeY&feature=grec_index')
    params = parse_qs(youtube_url.query)
    new_params = {'v': params['v'][0]}
    
    cleaned_youtube_url = urlunparse((youtube_url.scheme, \
                                      youtube_url.netloc, \
                                      youtube_url.path,
                                      None, \
                                      urlencode(new_params), \
                                      youtube_url.fragment))
    

    代码有点多,但它可以让你避免正则表达式的疯狂。

    正如 hop 所说,您应该为正则表达式使用原始字符串。

    【讨论】:

    • 我给出(并删除)了相同的答案,但问题是实际 find url,而不是解析它。
    • 好吧,他想两者兼得。他想找到 url 并解析它(因为他需要去掉部分查询字符串)。我的建议是先找到 url,他的正则表达式已经根据问题做了。然后使用一些已经存在的代码把它分开,去掉他不想要或不需要的东西。
    【解决方案4】:

    这是我在脚本中实现它的方式:

    string = "Hey, check out this video: https://www.youtube.com/watch?v=bS5P_LAqiVg"
    
    youtube = re.findall(r'(https?://)?(www\.)?((youtube\.(com))/watch\?v=([-\w]+)|youtu\.be/([-\w]+))', string)
    
    if youtube:
        print youtube
    

    输出:

    ["", "youtube.com/watch?v=BS5P_LAqiVg", ".com", "watch", "com", "bS5P_LAqiVg", ""]
    

    例如,如果您只想获取视频 ID,您可以:

    video_id = [c for c in youtube[0] if c] # Get rid of empty list objects
    video_id = video_id[len(video_id)-1] # Return the last item in the list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2021-09-01
      • 2018-03-18
      • 1970-01-01
      相关资源
      最近更新 更多