Regex проблема - выскабливание YouTube - PullRequest
0 голосов
/ 23 марта 2012

У меня проблемы с кодом Regex при очистке страниц плейлиста YouTube. В основном работает нормально, но набирает пару странных результатов

Выражение:

(?<=v=)[a-zA-Z0-9-_]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+

Примеры того, что выбрать:

yXBckFyiMyU,
opWYnUpNtG8,
YFbLRZCExBk,
I_GZahAl-PQ,
G6F_iP-F7Fw

по таким ссылкам

https://www.youtube.com/watch?v=_ClmClS_Mqs&list=PL6422619E56951B73&index=5&feature=plpp_video

По большей части это работает нормально, но также подхватывает эти экземпляры

data-thumb="//i1.ytimg.com/vi/84GVRtJ1CvY/<FROM RIGHT ONWARDS IS WHAT IT MATCHES>default.jpg" ><span class="vertical-align"></span></span></span></span>

data-thumb="//i4.ytimg.com/vi/WNIPqafd4As/<FROM RIGHT ONWARDS IS WHAT IT MATCHES>default.jpg" alt="" class="thumb"></span></span></span><span class="clip"><span class="centering-offset"><span class="centering"><span class="ie7-vertical-align-hack">

Регекс довольно устрашающий. Кто-нибудь знает, что не так с выражением?

1 Ответ

4 голосов
/ 23 марта 2012

Как подсказка, строки, которые вы хотите сопоставить, всегда имеют длину 11 символов.Вместо того, чтобы пытаться сопоставить «как можно больше символов» с помощью квантификатора +, вместо этого сопоставьте «ровно 11 символов» с помощью квантификатора {11}.

Это может вылечить симптомы о проблеме чрезмерного соответствия, которую вы видите, хотя я не знаю, почему она в первую очередь соответствует этим строкам.(Они не начинаются с v=.)

Вы, вероятно, должны уточнить свои чередования |, заключив в скобки:

((?<=v=)[a-zA-Z0-9-_]+(?=&))|((?<=[0-9]/)[^&\n]+)|((?<=v=)[^&\n]+)

, и если ваш вариант регулярного выражения поддерживает подробные регулярные выражения (комментариивнутри регулярных выражений) используйте их!


В качестве предложения - парсинг URL с помощью регулярных выражений является неприятным.Вместо этого я бы:

  • получил бы список всех URL-адресов на странице, используя анализатор HTML (в Python я использовал бы BeautifulSoup, что позволяет очень легко получить «все ссылки».)
  • Разбор каждого URL с использованием parse_url() (больше Python), получение словаря / хэша атрибутов GET.Пример:

Словарь может выглядеть так:

{
'v' : '_ClmClS_Mqs',
'list' : 'PL6422619E56951B73',
'index' : '5'
'feature' : 'plpp_video',
}

Тогда вы можете просто запросить атрибут GET v.Регулярные выражения не требуются.

Это специфично для Python, но Java будет иметь эквиваленты.Дело в том, что регулярное выражение не всегда является лучшим инструментом (просто наиболее общим инструментом.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...