Регулярные выражения для номера телефона и электронной почты

Написать функцию, которая на вход принимает строку, а на выход выдает булево значение (True или False), которое истинно, если полученная строка соответствует российскому номеру телефона или адресу электронной почты. Допустимые форматы телефонов. Код страны - всегда либо 7, либо 8, либо +7, либо опущен; код оператора может быть любой: 89160000000 +79160000000 9160000000 8(916)000-00-00 +7(916)000-00-00 (916)000-00-00 8 (916) 000-00-00 +7 (916) 000-00-00 (916) 000-00-00 8(916)0000000 +7(916)0000000 (916)0000000 8-916-000-00-00 +7-916-000-00-00 916-000-00-00 Валидным адресом электронной почты будем считать строки, содержащие @ и не меньше одной точки (после точки - не меньше двух символов), например: [email protected] [email protected] [email protected] [email protected] Невалидные адреса: @abc.abc abc@abc [email protected] [email protected] abc@abc. abc@abc@abc

Моя логика такая:

  1. Сначала очищаем номер от всех знаков препинания, кроме первого знака.
  2. Затем убираем лишние пробелы и скобки, если номер ими разделён.
  3. Дальше проверяем чтобы в номере телефона было 10 цифр.
  4. Дальше указываем, что номер телефона может начинаться с +7 или 8 и далее цифры от 0 до 9 или это почта в ней могут быть английские буквы и цифры, потом @ и ещё буквы и цифры, потом точка и ещё буквы.
  5. И на выходе получаем True или False, в зависимости от выполнения условия.

Объясните, пожалуйста, подробнее что не так и как это исправить в моём коде, чтобы всё работало.

digits_count = 0

import re
def check_string(string):
    phone = re.sub(r'\b\D', '', string)
    clear_phone = re.sub(r'[\ \(]?', '', phone)
    while int(clear_phone) > 0:
        digits_count += 1
        clear_phone = int (clear_phone) // 10
    if clear_phone = re.findall(r'^[\+7|8]*?\d(0-9)$', clear_phone) or re.match(r'[a-zA-Z0-9][a-zA-Z0-9_.-]{1,63}?@[a-zA-Z0-9_.-]{2,63}\.[a-zA-Z]+',string):
        return(bool(string))
    else: return(False)   
print(check_string(input()))

Ответы (0 шт):