Python正则表达式将youtube url转换为youtube视频
我正在制作一个正则表达式,以便在用户发布的一段HTML文本中找到youtube链接(可以是多个链接) 目前我正在使用以下正则表达式来更改'http://www.youtube.com/watch?v=-JyZLS2IhkQ'显示相应的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
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})