2013-06-28 4 views
1

Я пытаюсь написать свое собственное расширение разметки и для видео, которое я хочу, чтобы пользователь мог предоставить дополнительные значения для ширины и высоты. Доступные форматы разгрузки следующие:Python regexp с необязательными параметрами

http:/vimeo.com/456456456[width,height] 
http:/vimeo.com/456456456 
http:/vimeo.com/456456456[,height] 
http:/vimeo.com/456456456[width,] 

У меня нет вопросов с первой частью, но только с последней - шириной и высотой. Мой текущий регулярное выражение выглядит следующим образом:

rx = r'([^(]|^)(http|https)://(?:www.|)vimeo\.com/(?P<vimeoid>\d+)(?:\[(?P<width>\d+|),\s*,\s*(?P<height>\d+|)\]|)\S*' 

На самом деле интересное только последняя часть этого: (?:\[(?P<width>\d+|),\s*,\s*(?P<height>\d+|)\]|). Он отлично работает, если я предоставляю значения для ширины и высоты. Но если я опускаю его или опуская всю часть скобки (это должно быть хорошо), мой код по-прежнему возвращает захваченные группы для width и height со значениями None. Это не то, чего я хочу.

Я хочу, чтобы при использовании не предоставлялась ширина или высота или не были предоставлены пустые скобки или не были предоставлены вообще, тогда группы по ширине и высоте не оцениваются.

UPD: Возможно, это побочный эффект регулярного выражения python - всегда оценивать именованные группы, я не уверен.

+0

Будут ли в URL-адресах буквальные '[' и ']'? – anubhava

+0

Нет, я полагаю, что символы [] не найдены в URL-адресе. –

+0

В этом случае pls предоставляют некоторые реальные примеры URL-адреса. – anubhava

ответ

3

сделать сама группу необязательно вместо того, что он содержит:

...(?:\[(?P<width>\d+)?\s*,\s*(?P<height>\d+)?\])? 

Также ?, как правило, более удобный для чтения, чем пустая альтернатива (и потенциально более эффективная).

Теперь, если опустить либо width, то m.group(width) будет None (и аналогично для height). Обратите внимание, что нет способа избавиться от этого None. Когда re применяет регулярное выражение, оно будет инициализировать все значения, соответствующие группе в шаблоне (то есть все нумерованные группы и все именованные группы, которые находятся в шаблоне, будет определены в .group()). Различие между группами, участвующими в матче, и теми, кто их не делает, является то, дают ли они строку (возможно, пустую) или являются ли они None. Вот так вот.

Обратите внимание, что этот шаблон также позволяет использовать [,] в качестве синонимов, исключающих скобки.

+0

Я уже пробовал это регулярное выражение. Он по-прежнему определяет ширину и высоту None. –

+1

@ AlexG.P. вы не избавитесь от этого. Вот как работают все соответствующие функции в модуле 're'. Что случилось с проверкой «Нет»? –

+0

неправильный 2 избыточная строка кода =) –