Python正则表达式将youtube url转换为youtube视频

Python正则表达式将youtube url转换为youtube视频,python,regex,url,youtube,Python,Regex,Url,Youtube,我正在制作一个正则表达式,以便在用户发布的一段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) (其中变量“tag”是一点ht

我正在制作一个正则表达式,以便在用户发布的一段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)
(其中变量“tag”是一点html,因此视频可以工作,并且“value”用户帖子)

现在这就行了。。直到url如下所示:

"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
谢谢你的想法,非常感谢


Stefan

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

你不必逃避每一个看起来特别的角色,只需要逃避那些看起来特别的角色

您可以使用
,而不是指定空分支(
(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&=%])'
不过,我不会对这一普遍解决办法抱有太多信心。众所周知,很难对用户输入进行可靠的解析。

如果您使用搜索引擎将找到的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所说,您应该为正则表达式使用原始字符串。

这里是我如何解决它的:

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))

以下是我如何在脚本中实现它:

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

你的正则表达式很糟糕:)等等什么?你是想找到隐藏在html代码中的youtube链接吗?我很难从你的问题中解析出来!对于这个糟糕的问题,我很抱歉,我更改了te帖子,希望它现在更清楚。关于糟糕的正则表达式,如何改进它?您的示例不是真正的html,您没有告诉我们可以从值中得到什么。如果值是用户提供的,您将遇到各种各样的麻烦。我给出了(并删除了)相同的答案,但问题是实际查找url,而不是解析它。好吧,他想两者兼而有之。他想找到url并解析它(因为他需要去掉部分查询字符串)。我的建议是先找到url,根据问题,他的正则表达式已经找到了url。然后使用一些已经存在的代码将其分离出来,去掉他不想要或不需要的内容http://www.youtube.com/watch?feature=player_detailpage&v=QemTZn8YfJ0#t=46s我把你的正则表达式编辑成
youtube正则表达式=(r'(https?:/)?(www\)?“(youtube | youtube | youtube nocookie)\(com | be)/“(watch\?*(?=v=)v=|嵌入/| v/| v/|+?)([^=%\?){11})