当我尝试使用正则表达式提取此视频ID(AIiMa2Fe-ZQ)时,我无法获得所有字母后的短划线。
>>> id = re.search('(?<=\?v\=)\w+', 'http://www.youtube.com/watch?v=AIiMa2Fe-ZQ')
>>> print id.group(0)
>>> AIiMa2Fe
答案 0 :(得分:2)
而不是\ w +使用下面。单词字符(\ w)不包含短划线。它只包括[a-zA-Z_0-9]。
[\w-]+
答案 1 :(得分:1)
>>> re.search('(?<=v=)[\w-]+', 'http://www.youtube.com/watch?v=AIiMa2Fe-ZQ').group()
'AIiMa2Fe-ZQ'
\w
是python2.x中[a-zA-Z0-9_]
的缩写,你必须在py3k中使用re.A
标志。你很明显在该videoid中有其他角色,即连字符。我还从lookbehind中删除了多余的逃逸反斜杠。
答案 2 :(得分:1)
/(?:/v/|/watch\?v=|/watch#!v=)([A-Za-z0-9_-]+)/
有三种备用YouTube格式:/v/[ID]
和watch?v=
以及新的AJAX watch#!v=
此RE可捕获所有这三种格式。用户页面还有新的YouTube网址,其格式为/ user / [user]?content = {complex URI}这里没有任何正则表达式捕获...
答案 3 :(得分:1)
我不知道youtube哈希的模式,但只是在可能性中包含“ - ”,因为它不被视为alpha:
import re
id = re.search('(?<=\?v\=)[\w-]+', 'http://www.youtube.com/watch?v=AIiMa2Fe-ZQ')
print id.group(0)
我编辑了上述内容,因为事实证明:
>>> re.search("[\w|-]", "|").group(0)
'|'
“|”在字符定义中不作为特殊字符,但确实匹配“|”管。道歉。
答案 4 :(得分:1)
使用urlparse模块代替正则表达式来处理这类事情。
import urlparse
parsed_url = urlparse.urlparse(url)
if parsed_url.netloc.find('youtube.com') != -1 and parsed_url.path == '/watch':
video = urlparse.parse_qs(parsed_url.query).get('v', None)
if video is None:
video = urlparse.parse_qs(parsed_url.fragment.strip('!')).get('v', None)
if video is not None:
print video[0]
编辑:针对即将推出的新youtube网址格式进行了更新。
答案 5 :(得分:0)
我试试这个:
>>> import re
>>> a = re.compile(r'.*(\-\w+)$')
>>> a.search('http://www.youtube.com/watch?v=AIiMa2Fe-ZQ').group(1)
'-ZQ'