Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2013 14:00:28

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

Составить регулярное выражение

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  
алгоритм должен быть однопроходным


sergeek
regex = 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)

Офлайн

#2 Сен. 16, 2013 16:21:37

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Составить регулярное выражение

py.user.next
>>> regex.match('a“.”b')
исправил
py.user.next
regex.match('a“”bx')
а с этим что не так?

Офлайн

#3 Сен. 16, 2013 16:30:24

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Составить регулярное выражение

> я, кажется даже скачивал эту книгу, но что-то мне там не понравилось)
> примеров на питоне там мало совсем ЕМНИП

В ИТ нет мелочей, как и в любой другой области. Любое самое маленькое дело можно изучать бесконечно и при желании написать об этом книгу.

Офлайн

#4 Сен. 16, 2013 20:56:49

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

Составить регулярное выражение

sergeek
а с этим что не так?
это показалось

regex = re.compile(r'^("([a-z-0-9_!:,]|\.(?!\.))*"|[a-z-0-9_]|\.(?!\.))+$')
добавил ограничитель в конце
убрал незахватывающие группы
убрал лишние скобки
добавил начало строки

add
убрал ограничитель в конце



Отредактировано py.user.next (Сен. 16, 2013 21:46:21)

Офлайн

#5 Сен. 16, 2013 21:25:14

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Составить регулярное выражение

py.user.next
{1,128}
Так не получится же. То что в кавычках за одну лексему будет считаться
скобок перебрал, да)

Офлайн

#6 Сен. 16, 2013 21:45:47

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

Составить регулярное выражение

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]$


через re sergeek'а без ограничителя быстрее в 10 раз (проверки шаблонов на C сделаны)



Отредактировано py.user.next (Сен. 17, 2013 03:36:16)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version