Вы должны указать свои регулярные выражения в виде необработанных строк.
Вам не нужно избегать каждого символа, который выглядит особенным, только те, которые являются .
Вместо указания пустой ветви ((foo|)
), чтобы сделать что-то необязательное, вы можете использовать ?
.
Если вы хотите включить -
в набор символов, вы должны его избежать или поставить сразу после открывающей скобки.
Вы можете использовать специальные наборы символов, такие как \w
(равно [a-zA-Z0-9_]
), чтобы сократить регулярное выражение.
r'(https?://)?(www\.)?youtube\.(com|nl)/watch\?v=([-\w]+)'
Теперь, чтобы сопоставить весь URL, вам нужно подумать о том, что может или не может следовать за ним во входных данных. Затем вы помещаете это в промежуточную группу (вы не хотите ее потреблять).
В этом примере я взял все, кроме -
, =
, %
, &
и буквенно-цифровых символов, чтобы завершить URL (слишком лениво, чтобы думать об этом сложнее).
Все, что находится между аргументом v и концом URL, нежадно используется .*?
.
r'(https?://)?(www\.)?youtube\.(com|nl)/watch\?v=([\w-]+)(&.*?)?(?=[^-\w&=%])'
Тем не менее, я бы не слишком верил в это общее решение. Общеизвестно, что пользовательский ввод трудно анализировать надежно.