Проблема с использованием символьных классов в регулярном выражении
Очередная задача для определения валидности емэйла, но с необычным 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 шт):
- В имени хоста не должно идти 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