2010-04-14 4 views
2

Когда я пытаюсь извлечь этот идентификатор видео (AIiMa2Fe-ZQ) с выражением регулярного выражения, я не могу получить тире все буквы после.Проблема с Python: Small Regex

Кто-то может мне помочь?

Благодаря

>>> id = re.search('(?<=\?v\=)\w+', 'http://www.youtube.com/watch?v=AIiMa2Fe-ZQ') 
>>> print id.group(0) 
>>> AIiMa2Fe 
+0

Тот же вопрос, в PHP вместо Python: http://stackoverflow.com/questions/1773822/get-youtube-video-id-from-html-code -with-php. –

+2

Кроме того, YouTube будет изменять свои URI, поэтому вы также сможете обрабатывать их: http://apiblog.youtube.com/2010/03/upcoming-change-to-youtube-video-page.html –

+0

См. Ответ drewk ниже для полного покрытия формата youtube. – manifest

ответ

1

Я не знаю, шаблон для YouTube хэшей, а просто включать «-» в возможностях, поскольку это не считается альфа:

import re 
id = re.search('(?<=\?v\=)[\w-]+', 'http://www.youtube.com/watch?v=AIiMa2Fe-ZQ') 
print id.group(0) 

я редактировал выше, потому что, как Оказывается:

>>> re.search("[\w|-]", "|").group(0) 
'|' 

"|" в определении символа не действует как особый символ, но действительно соответствует «|» труба. Мои извинения.

+0

разрешен ли канал в идентификаторе youtube? Я так не думаю. – SilentGhost

+0

Из документов: «Некоторые символы, такие как '|' или '(', are special. " " A | B, где A и B могут быть произвольными REs, создает регулярное выражение, которое будет соответствовать либо A, либо B.« « Чтобы сопоставить литерал '|', используйте \ | или заключите его в класс символов, как в [|]. " – manifest

+0

** Идентификатор youtube video не содержит' | '** (pipe). – SilentGhost

1
>>> re.search('(?<=v=)[\w-]+', 'http://www.youtube.com/watch?v=AIiMa2Fe-ZQ').group() 
'AIiMa2Fe-ZQ' 

\w это стенография для [a-zA-Z0-9_] в python2.x, вы должны будете использовать re.A флаг в py3k. У вас довольно явно есть дополнительный символ в этом видео, например, дефис. Я также удалил лишнюю обратную косую черту с lookbehind.

+0

Я думаю, что '-ZQ $' не является частью идентификатора ... – dawg

+0

@drewk: OP совершенно ясно говорит, что они – SilentGhost

+0

Мой плохой - извините ... – dawg

1

/(?:/v/|/watch\?v=|/watch#!v=)([A-Za-z0-9_-]+)/

Explain the RE

Есть три чередовать YouTube форматы: /v/[ID] и watch?v= и новый AJAX watch#!v= Это RE захватывает все три. Существует также новый URL-адрес YouTube для пользовательских страниц, которые имеют форму/пользователь/[пользователь]? Content = {complex URI}. Это не фиксируется здесь никаким регулярным выражением ...

+0

+1 для покрытия формата youtube – manifest

2

Intead of \ w + используется ниже. Символ слова (\ w) не включает тире. Он включает только [a-zA-Z_0-9].

[\w-]+ 
1

Используйте модуль urlparse вместо regex для таких вещей.

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] 

EDIT: обновление для предстоящего нового формата YouTube URL.

0

Я хотел бы попробовать это:

>>> import re 
>>> a = re.compile(r'.*(\-\w+)$') 
>>> a.search('http://www.youtube.com/watch?v=AIiMa2Fe-ZQ').group(1) 
'-ZQ'