Как использовать Regex, чтобы найти идентификатор в ссылке на YouTube? - PullRequest
2 голосов
/ 14 апреля 2010

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

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

Ответы [ 6 ]

2 голосов
/ 14 апреля 2010

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

[\w-]+
1 голос
/ 14 апреля 2010

Используйте модуль 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]

РЕДАКТИРОВАТЬ: Обновлено для предстоящего нового формата URL YouTube.

1 голос
/ 14 апреля 2010

Я не знаю шаблон для хэшей на 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)
'|'

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

1 голос
/ 14 апреля 2010
/(?:/v/|/watch\?v=|/watch#!v=)([A-Za-z0-9_-]+)/

Объясните RE

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

1 голос
/ 14 апреля 2010
>>> 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. В этом видеоиде у вас явно есть дополнительный символ, то есть дефис. Я также удалил лишние обратные косые черты с обратной стороны.

0 голосов
/ 15 апреля 2010

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

>>> import re
>>> a = re.compile(r'.*(\-\w+)$')
>>> a.search('http://www.youtube.com/watch?v=AIiMa2Fe-ZQ').group(1)
'-ZQ'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...