Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 9, 2012 14:15:18

lavrton
От:
Зарегистрирован: 2010-11-13
Сообщения: 35
Репутация: +  1  -
Профиль   Адрес электронной почты  

Проверка валидности email без сторонних модулей.

Добрый день. Встала такая задача: нужно распарсить входную строку - найти в ней email адреса.
Специфика такова, что код выполняется в окружении, где особая политика безопасности и НИ ОДИН модуль импортировать нельзя.
Парсить получается, но иногда бывают проблемы.
Может где встречали код: как можно проверить строку с email адресом на валидность? Использовать можно только встроенные функции: strip, split, и т.д.



Отредактировано lavrton (Июнь 9, 2012 14:16:02)

Офлайн

#2 Июнь 9, 2012 14:31:34

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проверка валидности email без сторонних модулей.

Можно выдернуть из Django

class RegexValidator(object):
    regex = ''
    message = _(u'Enter a valid value.')
    code = 'invalid'
    def __init__(self, regex=None, message=None, code=None):
        if regex is not None:
            self.regex = regex
        if message is not None:
            self.message = message
        if code is not None:
            self.code = code
        # Compile the regex if it was not passed pre-compiled.
        if isinstance(self.regex, basestring):
            self.regex = re.compile(self.regex)
    def __call__(self, value):
        """
        Validates that the input matches the regular expression.
        """
        if not self.regex.search(smart_unicode(value)):
            raise ValidationError(self.message, code=self.code)
class EmailValidator(RegexValidator):
    def __call__(self, value):
        try:
            super(EmailValidator, self).__call__(value)
        except ValidationError, e:
            # Trivial case failed. Try for possible IDN domain-part
            if value and u'@' in value:
                parts = value.split(u'@')
                try:
                    parts[-1] = parts[-1].encode('idna')
                except UnicodeError:
                    raise e
                super(EmailValidator, self).__call__(u'@'.join(parts))
            else:
                raise
email_re = re.compile(
    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
    # quoted-string, see also http://tools.ietf.org/html/rfc2822#section-3.2.5
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"'
    r')@((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$)'  # domain
    r'|\[(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\]$', re.IGNORECASE)  # literal form, ipv4 address (SMTP 4.1.3)
validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid')



Офлайн

#3 Июнь 9, 2012 14:34:08

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Проверка валидности email без сторонних модулей.

Если не нашли ничего питонового, то возьмите какой-нибудь сишный парсер и перепишите на Питоне. Ну, например, этот: http://www.oreillynet.com/network/excerpt/spcookbook_chap03/index3.html. Второй вариант - положите код питоновых библиотек, которых не хватает к себе в модуль и юзайте без импорта.



Офлайн

#4 Июнь 9, 2012 14:35:29

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Проверка валидности email без сторонних модулей.

FishHook
Можно выдернуть из Django
Это не катит. Здесь нужно будет импортировать re.



Офлайн

#5 Июнь 9, 2012 14:40:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проверка валидности email без сторонних модулей.

Ed
FishHook
Можно выдернуть из Django
Это не катит. Здесь нужно будет импортировать re.
А он небольшой сам модуль то. Ты его не импортируй, ты его в проект включи, обзови my_re и юзай с наздоровье (ну и зависимости естественно тоже)



Офлайн

#6 Июнь 9, 2012 14:44:44

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Проверка валидности email без сторонних модулей.

Если у них такая параноя, то это не прокатит. Непонятно правда зачем тогда на Питоне это писать, если так извращаться нужно. Проще тогда уже на Си. Кода ненамного больше, а быстрее будет в десятки раз.



Офлайн

#7 Июнь 10, 2012 04:40:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9890
Репутация: +  854  -
Профиль   Отправить e-mail  

Проверка валидности email без сторонних модулей.

lavrton
Может где встречали код: как можно проверить строку с email адресом на валидность?
нужен конечный автомат
wiki. конечный автомат
пример

ещё инфа
конечный автомат
конечный автомат в лексическом анализе



Отредактировано py.user.next (Июнь 10, 2012 11:17:40)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version