Complementando, alguns detalhes:
\s
não é somente para espaços em branco. Na verdade este atalho também corresponde a quebras de linha, TAB, e muitos outros caracteres.
Já os atalhos \d
e \w
também consideram caracteres de outros idiomas - em Python, o default é considerar quaisquer letras e dígitos definidos pelo Unicode (por exemplo, \d
também considera o caractere ٨
- ARABIC-INDIC DIGIT EIGHT, entre muitos outros). O mesmo vale para \w
, que considera letras de outros alfabetos (japonês, árabe, cirílico, etc). Então tem que considerar se quer estes caracteres no seu email.
Quanto a regex de email, tem alguns poréns. Por exemplo, ela considera que [email protected]
e .@-._
são emails válidos, veja.
Isso porque [\w\.-]+
diz que pode ter uma ou mais ocorrências de letra, dígito, _
, ponto ou hífen, mas ela não obriga que tenha cada um desses caracteres (se tiver somente um deles, já serve). Ou seja, ---
e .
já são suficientes para satisfazer esta expressão. Uma regex para validar email de forma mais assertiva é bem mais complicada.
Sobre o uso de regex para validar emails, também tem algumas coisas aqui, aqui, aqui, aqui e aqui (este último link tem algumas opções no final, só não recomendo a última regex).
Mas a meu ver a regex serviria apenas como um filtro inicial (por exemplo, para ver se algo se parece minimamente com um endereço de email). Mas no fim, uma validação mais confiável seria mandar um email com um link de confirmação, por exemplo. Aí vc garante não só que o email existe, como também que ele está em uso por alguém.
Não me entenda mal. Regex é legal, eu particularmente gosto bastante, mas nem sempre é a melhor solução. É muito fácil fazer uma regex que funcione para os casos válidos, mas é bem difícil fazer uma que também recuse os casos inválidos.