Проблема с использованием символьных классов в регулярном выражении

Очередная задача для определения валидности емэйла, но с необычным 3-им условием:

  1. Емэйл не содержит пробелов;
  2. Емэйл содержит символ @ ;
  3. После @ есть точка, но в правильном адресе точка не должна стоять сразу после @ ( @. не должно быть в строке).

Я пользовалась regex и с его помощью написала часть кода, которая видит условие "@." Вот она:

(@[-\.])

Но я не могу понять, как мне сделать эту часть отрицательно?! Поставить крышечку ^?! Но куда?! Между @ и [?!

И ещё я переживаю, что программа будет выдавать False, если увидит любую точку, которая будет после знака @. Т.е. и [email protected] будет False и [email protected] тоже False(а по сути True).

Ну и вот весь код целиком для полноты картины:

import re
symbols = r"^\S+[-\w\.\@]+^(@[-\.])$"
email = str(input())
print(bool(re.findall(symbols, email)))

Ответы (1 шт):

Автор решения: GrAnd
  1. В имени хоста не должно идти 2 точки подряд.

Искомое выражение:

\S+@[^.\s]+(?:\.[^.\s]+)+

Где:
\S+ - Любые не пробельные символы
@ - Собственно сам символ @
[^.\s]+ - Любые не пробельные символы, но не точка. В количестве от одного и больше.
(?:\.[^.\s]+)+ - Последовательность из символа точка и ненулевого количества не пробельных символов и не точки. Эта последовательность может повторяться много раз, но не менее одного.

И если надо сверить строку на полное соответствие, то резонно использовать re.fullmatch() для этого.

import re

for email in (  "a", 
                "a@b", 
                "[email protected]", 
                "[email protected]", 
                "[email protected]", 
                "[email protected]", 
                "[email protected]", 
                "[email protected]." ):
    print(email, "=>", bool(re.fullmatch(r"\S+@[^.\s]+(?:\.[^.\s]+)+", email)))
a => False
a@b => False
[email protected] => False
[email protected] => True
[email protected] => True
[email protected] => True
[email protected] => False
[email protected]. => False
→ Ссылка