regex для почтовой проверки [дубликат]

Я думаю, что проблема, с которой вы столкнулись выше, заключается в том, что ваш текст уже находится в формате Unicode, и вы пытаетесь преобразовать его в Unicode во второй раз, что вызывает вашу ошибку.

Приведенный ниже код работал для меня и дал результаты, показанные ниже.

from bs4 import BeautifulSoup

text = "Albert Einstein’s Theory of Relativity: Should We Worry…?"
parsed_html = BeautifulSoup(text)

print 'Original Type: ' + type(text)
print 'Original Text: ' + text
print 'Parsed Type:   ' + type(parsed_html.text)
print 'Parsed Text:   ' + parsed_html.text

Вывод:

Original Type: <type 'str'>
Original Text: Albert Einstein&#8217;s Theory of Relativity&#58; Should We Worry&#8230;&#63;
Parsed Type: <type 'unicode'>
Parsed Text: Albert Einstein’s Theory of Relativity: Should We Worry…?

Использование BeautifulSoup4 версии 4.7.1

pip install bs4

9
задан chipotle_warrior 3 February 2009 в 17:34
поделиться

7 ответов

Вместо. попытайтесь соответствовать каждому символу кроме \s (пробел):

/[^\s]*@[a-z0-9.-]*/i
1
ответ дан 4 December 2019 в 06:27
поделиться

Это намного более сложно!!! Посмотрите Почту:: RFC822:: Адрес и бояться... очень испуганные.

15
ответ дан 4 December 2019 в 06:27
поделиться

Не используйте регулярные выражения для проверки адресов электронной почты

Вместо этого из mail.python.org/pipermail/python-list1, записанного Ben Finney.

Лучший совет, который я видел, когда люди спрашивают, "Как я проверяю, допустим ли адрес электронной почты?" была "Почта отправки попытки к нему".

Это - и Pythonic и действительно лучший способ. Если Вы на самом деле хотите подтвердить, не пытайтесь проверить его статически; используйте адрес электронной почты и проверьте результат. Пошлите электронное письмо тому адресу и не используйте его дальше, если Вы не получаете высказывание ответа "да, это - правильный адрес для использования" от получателя.

Агент передачи почты передающей системы, не регулярные выражения, определяет, в который часть является доменом для отправки почты.

Система доменных имен, не регулярные выражения, определяет, какие домены допустимы, и какой хост должен получить почту для того домена.

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

1This исходная ссылка, прежде чем она пошла мертвая

14
ответ дан 4 December 2019 в 06:27
поделиться

Почти ничто, что Вы используете, который достаточно короток для создания смысла, смотрящего на него, ДЕЙСТВИТЕЛЬНО не проверит адрес электронной почты. Так как это сказан, вот то, что я обычно использую:

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

Это - на самом деле созданный в regex для блока проверки допустимости регулярного выражения ASP.NET для адресов электронной почты.

Примечание: многие regexes, данные в этом потоке, ВОЗМОЖНО, работали в 90-х, но TLD's позволяют быть меньше чем 2 символами и больше чем 4 символами в сегодняшней веб-среде. Например, info@about.museum ЯВЛЯЕТСЯ действующим электронным адресом, потому что .museum является одним из тех новый, длинный TLDs.

6
ответ дан 4 December 2019 в 06:27
поделиться

Я нашел, что вместо того, чтобы соответствовать целому адресу электронной почты против регулярного выражения, это намного более практично, чтобы просто разделить строку в и:

  • Сначала проверьте на существующий MX или записи доменной части через библиотеку DNS.
  • Затем проверьте localpart (часть на левой стороне) против более простого regex.

Причина сделать проверка DNS состоит в том, что недостижимые адреса электронной почты, хотя совместимый RFC ничего не стоят. Причина того, чтобы дополнительно проверить A-запись состоит в том, что они используются для определения, куда поставить почту тому, когда никакая запись MX не найдена. (см. RFC2821, 3.6),

Дальнейшие подсказки:

  • Пользуйтесь устойчивой библиотекой сопоставителя DNS, не прокручивайте свое собственное. Протестируйте его против крупных компаний. Они иногда имеют огромное количество mailservers, который может привести к проблемам. Я досмотрел ошибочное дерьмо библиотеки до конца на bmw.com. Просто высказывание.:)
3
ответ дан 4 December 2019 в 06:27
поделиться

это прибывает от Regex Buddy (определенно потребность купить прогр!)

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b
0
ответ дан 4 December 2019 в 06:27
поделиться

Меньшие два ступают, regex обеспечивает хорошие результаты

/ ** проверка, чтобы видеть, находится ли адрес электронной почты в допустимом формате. * Начальный символ почтового ящика должен быть альфой
* оставшиеся символы, алфавитно-цифровые плюс - _ и точка
Основой домена * должны быть по крайней мере 2 символа
* домен верхнего уровня должен быть по крайней мере 2, не больше чем 4 альфами
* Субдомены разрешены. * @version 050208 добавил апостроф как допустимый символ * @version 25.04.07 однобуквенный адрес электронной почты и единственный
* обозначают буквами доменные имена, разрешены. общественность */статическая булевская переменная isValidEmailAddress (Строковый адрес) {Строка sRegExp;

    // 050208 using the literal that was actually in place
    // 050719 tweaked 
    // 050907 tweaked, for spaces next to @ sign, two letter email left of @ ok
    // 042507 changed to allow single letter email addresses and single letter domain names
    // 080612 added trap and unit test for two adjacent @signs
    sRegExp =   "[a-z0-9#$%&]"          // don't lead with dot
        +   "[a-z0-9#$%&'\\.\\-_]*"     // more stuff dots OK
        +   "@[^\\.\\s@]"               // no dots or space or another @ sign next to @ sign
        +   "[a-z0-9_\\.\\-_]*"         // may or may  not have more character
        +   "\\.[a-z]{2,4}";            // ending with top level domain: com,. biz, .de, etc.

    boolean bTestOne =  java.util.regex.Pattern.compile( sRegExp,
            java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).matches();

    // should this work ?
    boolean bTwoDots =  java.util.regex.Pattern.compile("\\.\\.",  // no adjacent dots
                    java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find();

    boolean bDotBefore = java.util.regex.Pattern.compile("[\\.\\s]@", //no dots or spaces before @
                         java.util.regex.Pattern.CASE_INSENSITIVE).matcher(address).find();

    return bTestOne && !bTwoDots && !bDotBefore;
}   // end IsValidEmail
-1
ответ дан 4 December 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: