Как сделать шаблон после негативного взгляда достаточно жадным, чтобы соответствовать всему, что следует за ним

#python #regex

Вопрос:

Я хотел бы использовать регулярное выражение для сопоставления, например, адресов электронной почты, которые не должны отображаться в свойстве href. Итак, учитывая следующий (частичный) текст

 href="mailto:test@example.com"
whatever naked.email@example.net whatever
href="mailto:First Last <first.last@example.com>?Subject=SPAM"
 

Я бы хотел, чтобы регулярное выражение предупреждало меня только об адресе электронной почты во второй строке.

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

 (?<!href="mailto:)(?:[ w]*)?<?bw[w.] @w[w.] 
 

Для примера текста он соответствует второй и третьей строкам (а именно, whatever naked.email@example.net и irst Last <first.last@example.com ). В мои намерения не входило, чтобы третья строка соответствовала. Но очевидно, что отрицательный внешний вид приводит к тому, что следующий за ним шаблон не включается F в соответствие с этим шаблоном, что приводит к совпадению всего шаблона.

Как я могу изменить шаблон так, чтобы он соответствовал только второй строке. Меня интересуют как конкретные решения для примера проблемы сопоставления «голых» адресов электронной почты, так и понимание того, почему это происходит.

Ответ №1:

Сначала вы можете сопоставить то, что вам не нужно, и записать то, что вы хотите сохранить в группе.

В этом случае вы можете использовать

 href="[^"]*"|([^s@] @[^s@] )
 

Шаблон совпадает:

  • href="[^"]*" Совпадение href=" до первого появления "
  • | Или
  • ([^s@] @[^s@] ) Группа захвата 1, соответствует шаблону, подобному электронной почте

Демонстрация регулярных выражений