Форум сайта python.su
SoTэто всё легко делается через конечный автомат
1)имя (до @) не длиннее 128 символов, состоит из символов a-z0-9“._-
2)в имени не допускаются две точки подряд;
3)если в имени есть двойные кавычки ”, то они должны быть парными;
4)в имени могут встречаться символы “!,:”, но только между двойными кавычками.
SoTалгоритм должен быть однопроходнымdef valid_hostname ( hostname) : # имя (до @) не длиннее 128 символов, состоит из символов a-z0-9"._-; p_hostname = re.compile(u'[\.a-z0-9"_-]{1,128}$') if not ( p_hostname.match(hostname) ) : return False # в имени не допускаются две точки подряд; if re.search( u"\.\.", hostname ) : return False # если в имени есть двойные кавычки ", то они должны быть парными; l = re.compile(r'"') if ( len( l.findall(hostname) ) % 2 ) == 1 : return False return True
sergeekregex = re.compile('(?:(?:"[a-z-0-9_!:,]*")|(?:[a-z-0-9_]|(?:\.(?!\.))+))+$')
>>> import re >>> >>> regex = re.compile('(?:(?:"[a-z-0-9_!:,]*")|(?:[a-z-0-9_]|(?:\.(?!\.))+))+$') >>> >>> regex.match('a"."b') >>>
Отредактировано py.user.next (Сен. 16, 2013 20:56:15)
Офлайн
py.user.nextисправил
>>> regex.match('a“.”b')
py.user.nextа с этим что не так?
regex.match('a“”bx')
Офлайн
> я, кажется даже скачивал эту книгу, но что-то мне там не понравилось)
> примеров на питоне там мало совсем ЕМНИП
В ИТ нет мелочей, как и в любой другой области. Любое самое маленькое дело можно изучать бесконечно и при желании написать об этом книгу.
Офлайн
sergeekэто показалось
а с этим что не так?
regex = re.compile(r'^("([a-z-0-9_!:,]|\.(?!\.))*"|[a-z-0-9_]|\.(?!\.))+$')
Отредактировано py.user.next (Сен. 16, 2013 21:46:21)
Офлайн
py.user.nextТак не получится же. То что в кавычках за одну лексему будет считаться
{1,128}
Офлайн
sergeekпоправил обратно пока
Так не получится же.
#!/usr/bin/env python3 import re def is_login(s): y, n, quo, pt = True, 0, False, False for c in s: if not y or n == 128 or (c in '!,:' and not quo) or \ (c == '.' and pt) or not re.search(r'^[a-z0-9"._!,:-]$', c): y = False break n += 1 if c == '"': quo = not quo pt = False else: pt = c == '.' y = s != '' and y and not quo return y if __name__ == '__main__': for s in [ '', 'abc', 'a' * 128, 'a' * 129, 'abc..def', 'abc"."def', '"abc!,:def"', 'abc!,:def', '"abc!,:def""', '""', '""#' ]: print('<{}>: {}'.format(s, is_login(s)))
[guest@localhost login_ind]$ ./login_ind.py
<>: False
<abc>: True
<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>: True
<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>: False
<abc..def>: False
<abc"."def>: True
<"abc!,:def">: True
<abc!,:def>: False
<"abc!,:def"">: False
<"">: True
<""#>: False
[guest@localhost login_ind]$
Отредактировано py.user.next (Сен. 17, 2013 03:36:16)
Офлайн