Регулярные выражения для номера телефона и электронной почты
Написать функцию, которая на вход принимает строку, а на выход выдает булево значение (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
Моя логика такая:
- Сначала очищаем номер от всех знаков препинания, кроме первого знака.
- Затем убираем лишние пробелы и скобки, если номер ими разделён.
- Дальше проверяем чтобы в номере телефона было 10 цифр.
- Дальше указываем, что номер телефона может начинаться с +7 или 8 и далее цифры от 0 до 9 или это почта в ней могут быть английские буквы и цифры, потом @ и ещё буквы и цифры, потом точка и ещё буквы.
- И на выходе получаем 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()))