Найти - Пользователи
Полная версия: Составить регулярное выражение
Начало » Python для новичков » Составить регулярное выражение
1 2
py.user.next
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')
>>>
sergeek
py.user.next
>>> regex.match('a“.”b')
исправил
py.user.next
regex.match('a“”bx')
а с этим что не так?
lorien
> я, кажется даже скачивал эту книгу, но что-то мне там не понравилось)
> примеров на питоне там мало совсем ЕМНИП

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

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

add
убрал ограничитель в конце
sergeek
py.user.next
{1,128}
Так не получится же. То что в кавычках за одну лексему будет считаться
скобок перебрал, да)
py.user.next
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 сделаны)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB