Регулярка номера телефона в строке
необходима регулярка для обнаружения номеров телефонов в строке на Python.
Примеры номеров:
+79261234567
89261234567
79261234567
+7 926 123 45 67
8(926)123-45-67
123-45-67
9261234567
79261234567
(495)1234567
Нашел в интернет такую: ((8|+7)[- ]?)?((?\d{3})?[- ]?)?[\d- ]{7,10}.
Но она не работает, как надо, выдает местами ерунду. Я так понял она заточена под валидацию.
Ответы (2 шт):
Автор решения: Newby
→ Ссылка
Можно так:
phones = ("+79261234567,"
"89261234567,"
"79261234567,"
"+7 926 123 45 67,"
"8(926)123-45-67,"
"123-45-67,"
"9261234567,"
"79261234567,"
"(495)1234567")
res = re.findall(r"(\+?7|8)?[\- ]?(\(?\d{3}\)?)?[\- ]?(\d{7}|\d[\-\d ]{5,7}\d)[ |\,]", phones + " ")
Вывод:
[('+7', '926', '1234567'),
('8', '926', '1234567'),
('7', '926', '1234567'),
('+7', '926', '123 45 67'),
('8', '(926)', '123-45-67'),
('', '', '123-45-67'),
('', '926', '1234567'),
('7', '926', '1234567'),
('', '(495)', '1234567')]
Если сильно надо, то можно дополнительно конкатенировать.
Автор решения: Kers
→ Ссылка
Если возможно немного стандартизировать номера то можно попробовать так:
import re
pattern = r"(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})"
num = """
+79261234567
89261234567
79261234568
+7 926 123 45 67
8(926)123-45-67
123-45-67
9261234567
79261234567
(495)1234567
"""
# Cтандартизируем номера удаляя все лишнее
# Без некоторых можно и обойтись
num = num.replace(" ", "")
num = num.replace("-", "")
num = num.replace("(", "")
num = num.replace(")", "")
num = num.replace("+7", "8")
res = re.findall(pattern, num)
print(res)
# ['8926123456', '8926123456', '7926123456', '8926123456', '8926123456', '1234567', '9261234567', '7926123456', '4951234567']