2013-03-22 8 views
0

Я использую следующий код в настоящее время:Как проверить, что строка является электронной почтой?

regexp = re.compile(r'[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}', re.IGNORECASE) 
email = regexp.findall(stext) 
if email: 
    email = email[0] 

Но он будет работать даже тогда, когда stext содержит другой текст, а кроме того, по электронной почте (для бывших, some text [email protected] some other text.). Когда я хочу проверить, содержит ли stext[email protected]только (нормально, возможно, с ведущими или/или конечными пробелами, никакими другими символами).

PS. Я также думаю, что, вероятно, я должен использовать mail.is_email_valid вместо регулярного выражения, это will allow me для поддержки длинных доменов, таких как .museam или локальных доменов, таких как .рф.

+0

Вы можете использовать специальные символы '^' и '$' для соответствия началу и концу строки, соответственно. Что-то вроде 'r '^ [A-Z0-9 ._% + -] + @ [A-Z0-9 .-] + \. [A-Z] {2,4} $'' запустит вас. – jedwards

+0

http://docs.python.org/2/library/re.html#search-vs-match –

ответ

3

Вам нужно добавить^в начало, что означает «текст начинается здесь» и $, в конце которого «больше нет текста после».

Это дало бы:

r'^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$'

+1

Не учитывается «нормально, возможно, с ведущими или/или конечными пробелами, никаких других символов» ... добавление '\ s *' после^и до $ будет лучше. – isedev

+0

Хорошая идея, это не действительная электронная почта, хотя с пробелами. Возможно, обрезка пользовательского ввода, прежде чем что-либо сделать с ним, лучше. Это также учитывало бы сохранение электронных писем с пробелами в вашей базе данных, например – baloo

1

Используйте это регулярное выражение:

\s?[A-Z0-9_-+%][email protected][A-Z0-9_-+%]+\.[A-Z0-9]\s? 
0

Почему вы не используете \ б для границы слова до и после того, как по электронной почте?

Смежные вопросы