#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, соответствует шаблону, подобному электронной почте