Проверка записи номера телефона и электроной почты

Написать функцию, которая на вход принимает строку, а на выход выдает булево значение (True или False), которое истинно, если полученная строка соответствует номеру телефона или адресу электронной почты.

import re
def check_string(string):
    if re.match(r'[\+7|8]?.?(\d{3}).?(\d{3}).?(\d{2}).?(\d{2})',string) and len(string) <=11 or re.match(r'^\w+[\.]?(\w+)*\@(\w+\.)*\w{2,}$',string):
        return(bool(string))
    else: return(False)   
print(check_string(input()))

Вот код который справляется с почтой, но почти справляется с телефонами. Например если телефон записать с 9 (9231231212), то его длина должна быть 10 цифр, а если с 8 (89231231212), то 11, с +7 соответственно длина 12. Но если написать номер с 9 и он будет длиной 11 символов, то номер оказывается верным, а должен выводится Folse. Как ограничить длину номера, относительно его начала? (помимо знака + в телефоне могут быть скобки и тире)

Вот список номеров которые должны быть правильные: +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; номер -7 (910) 000-10-10 должен быть неправильный


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

Автор решения: Namerek

Посмотрите, такой результат нужен?

import re

phones_str = str('+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')

phones = re.split(r' *; *', phones_str, flags=re.M)


def check_phone(num: str):
    clear_phone = re.sub(r'\D', '', num)
    result = re.match(r'^[78]?\d{10}$', clear_phone)
    print(bool(result))


for phone in phones:
    check_phone(phone)

→ Ссылка
Автор решения: krumlyakov

Вот код к решению этой задачи.

import re
def check_string(string):
    phone = re.sub(r'\b\D', '', string)
    clear_phone = re.sub(r'[\ \(]?', '', phone)
    if re.findall(r'^[\+7|8]*?\d{10}$', clear_phone) or re.match(r'^\w+[\.]?(\w+)*\@(\w+\.)*\w{2,}$',string):
        return(bool(string))
    else: return(False)   
print(check_string(input()))

Сначала очищаем номер от всех знаков препинания, кроме первого знака, после убираем лишние пробелы и скобки, если номер ими разделён, дальше делаем по шаблону начиная с +7 или 8

→ Ссылка