2014-11-20 4 views
0

Я пытаюсь найти код, который будет соответствовать регулярному выражению по электронной почте для проекта. Таковы требования:Python группировка регулярных выражений?

Email должен быть в форме Acct @ домен

  • Acct 1 или более символов, и состоит только из верхних или строчных букв алфавита, цифр, тире, точки, подчеркивания и дефисы
  • acct не может начинаться или заканчиваться символом подчеркивания, тире, периоду или дефис. Должно быть не менее двух букв до и после каждого периода.
  • домен 5 или больше символов, и состоит только из верхнего или нижнего регистра символов алфавита, цифр, тире, периоды и дефисов, подчеркивает
  • домен должен иметь по крайней мере один период, и не может начало или конец с подчеркиванием, тире, периодом или дефисом. Должно быть не менее двух букв до и после каждого периода.
  • Я понял, учетный часть с кодом:

    if re.search("^[a-zA-z0-9]+[a-zA-z0-9-_]*$|^[a-zA-z0-9]+[a-zA-z0-9-_]+[\.]{1}[a-zA-z0-9]{2,}$", email): 
        print "valid!" 
    

    Также домен:

    if re.search("^[a-zA-z0-9]+[a-zA-z0-9-_]+[\.]{1}[a-zA-z0-9]{2,}$", email): 
        print "valid!" 
    

    Моя проблема заключается в том, что я не могу понять, как группировать их вместе и положил знак @

    Я пробовал следующее, но он не работает.

    if re.search("(^[a-zA-z0-9]+[a-zA-z0-9-_]*$|^[a-zA-z0-9]+[a-zA-z0-9-_]+[\.]{1}[a-zA-z0-9]{2,}$)@(^[a-zA-z0-9]+[a-zA-z0-9-_]+[\.]{1}[a-zA-z0-9]{2,}$)", email):<br> 
        print "valid! 
    

    "

    ЭТО НЕ РАБОТАЕТ! Я не могу получить его, чтобы когда-либо совпадают. Если у вас есть предложения, которые делают код менее nooby пожалуйста, дайте мне знать!

    +0

    Откуда берутся эти требования? Они дурацкие. Достаточно часто иметь адреса электронной почты, такие как 'u.thant @ un.example.org', просто потому, что имя некоторых людей - это одна буква. – tripleee

    +0

    Также квантификатор '{1}' совершенно лишний, а обратная косая черта в символьном классе соответствует буквальной обратной косой чертой. Вы хотите просто либо '\ .', либо' [.] '. – tripleee

    +0

    Вы разрешаете только один период в имени учетной записи или части домена. Ваши требования подразумевают, что допускается использование нескольких периодов, если между ними имеется несколько буквенно-цифровых символов. Это немного сложно объединить - вы можете использовать утверждения lookahead для объединения нескольких перекрывающихся ограничений, но это значительно усложняет регулярное выражение. Учитывая, что требования, похоже, все равно вытягиваются из тонкого воздуха, я не уверен, что это стоит усилий; но вы наверняка найдете сотни примеров подобных вопросов на этом сайте, чтобы учиться. – tripleee

    ответ

    1

    Используйте команду non-capturing group для объединения обоих регулярных выражений.

    if re.search(r"^(?:[a-zA-Z0-9]+[a-zA-Z0-9-]*|[a-zA-Z0-9]+[a-zA-Z0-9-]+[.][a-zA-Z0-9]{2,})@[a-zA-Z0-9]+[a-zA-Z0-9-_]+[.][a-zA-Z0-9]{2,}$", email): 
        print "valid" 
    

    DEMO

    Регулярное выражение:

    ^      the beginning of the string 
    (?:      group, but do not capture: 
        [a-zA-Z0-9]+    any character of: 'a' to 'z', 'A' to 
              'Z', '0' to '9' (1 or more times) 
        [a-zA-Z0-9-]*   any character of: 'a' to 'z', 'A' to 
              'Z', '0' to '9', '-' (0 or more times) 
    |      OR 
        [a-zA-Z0-9]+    any character of: 'a' to 'z', 'A' to 
              'Z', '0' to '9' (1 or more times) 
        [a-zA-Z0-9-]+   any character of: 'a' to 'z', 'A' to 
              'Z', '0' to '9', '-' (1 or more times) 
        [.]      any character of: '.' 
        [a-zA-Z0-9]{2,}   any character of: 'a' to 'z', 'A' to 
              'Z', '0' to '9' (at least 2 times) 
    )      end of grouping 
    @      '@' 
    [a-zA-Z0-9]+    any character of: 'a' to 'z', 'A' to 'Z', 
             '0' to '9' (1 or more times) 
    [a-zA-Z0-9-_]+   any character of: 'a' to 'z', 'A' to 'Z', 
             '0' to '9', '-', '_' (1 or more times) 
    [.]      any character of: '.' 
    [a-zA-Z0-9]{2,}   any character of: 'a' to 'z', 'A' to 'Z', 
             '0' to '9' (at least 2 times) 
    $      before an optional \n, and the end of the 
             string 
    
    +0

    Спасибо! очень ясно! – Jay

    1

    Get избавиться от якорей из двух групп и применить его ко всей группе, как

    if re.search(r"^(?:[a-zA-Z0-9]+[a-zA-Z0-9-]*|[a-zA-Z0-9]+[a-zA-Z0-9-]+\.[a-zA-Z0-9]{2,})@[a-zA-Z0-9]+[-\w]+\.[a-zA-Z0-9]{2,}$", email): 
        print "valid!" 
    

    Внесены изменения

    • Анкеры ^ и $ применяются ко всему регулярное выражение

    • [\.]{1} можно упростить, как \., так как он соответствует только один вхождение .

    • [a-zA-z0-9-_] может быть упрощена, как [-\w]

    +0

    Что значит r в начале? ??? – Jay

    +0

    @Jay 'r' создает строку raw string, которая будет обрабатывать обратные слэши в regex – nu11p01n73R

    1

    Ниже регулярное выражение, которое может подтвердить все ваши критерии, и я надеюсь, что он также является более эффективным.

    ^(?![\W_])((?:([\w-]{2,})\.?){1,})(?<![\W_])@(?![\W_])(?=[\w.-]{5,})(?=.+\..+)((?:([\w-]{2,})\.?){1,})(?<![\W_])$ 
    

    И вот regex demo.

    +0

    Смущает, но спасибо! – Jay

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