powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Форматирование номера телефона регулярками на питоне
25 сообщений из 98, страница 1 из 4
Форматирование номера телефона регулярками на питоне
    #40022970
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день
Прошу покритиковать решение. Интересно где есть избыточность - может быть можно меньшим количество кода обойтись или более быстрое решение есть.

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
def check(text):

    if re.search(r'^(\+)?(?:[78][\s\(]?\d\d\d\)?\s?\d\d\d-?\d\d-?\d\d|\d\d\d\)?\s?\d\d\d-?\d\d-?\d\d)$', text) == None:
        print('Fail!')
    else:
        list1 = re.findall(r'\d', text)
        list1 = ''.join(list1)

        if len(list1) == 10:
            print(re.sub(r'(\d{3})(\d{3})(\d{2})(\d{2})', r'+7 \1 \2-\3-\4', list1))
        else:
            print(re.sub(r'(\d)(\d{3})(\d{3})(\d{2})(\d{2})', r'+7 \2 \3-\4-\5', list1))
        
check('+7 123 456-78-90')
check('8(123)456-78-90')
check('7(123) 456-78-90')
check('1234567890')
check('123456789')
check('+9 123 456-78-90') 
check('+7 123 456+78=90')
check('+7(123 45678-90')
check('8(123  456-78-90')
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40022976
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как сделать минимально самодостаточный сорс? А то в этом чего-то не хватает.

Код: python
1.
2.
3.
4.
5.
6.
7.
$ python3 phone.py 
Traceback (most recent call last):
  File "phone.py", line 14, in <module>
    check('+7 123 456-78-90')
  File "phone.py", line 3, in check
    if re.search(r'^(\+)?(?:[78][\s\(]?\d\d\d\)?\s?\d\d\d-?\d\d-?\d\d|\d\d\d\)?\s?\d\d\d-?\d\d-?\d\d)$', text) == None:
NameError: name 're' is not defined
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40022977
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильное решение задачи начинается с её правильной постановки. А твое "как бы его мог ввести человек" это не задача, а пепец. Человек "может" ввести его задом наперед в восьмеричном исчислении. Опиши формально, какой формат считается корректным, тогда можно будет о чем-то говорить.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40022981
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда бизнес приходит к программисту и почёсывая ухо говорит дескыть вот надо такую штуку
сделать. Шобы значить вот эти целепхончики были гуд. А эти - фуфу. Слишком сильно давить
на наличие постановки я-бы не стал. И данная техническая сторя вполне по силу к обобщению
программистом.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40022982
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
бизнес приходит к программисту

Ну и, вот, у меня к "бузинесу", например, сразу же вопрос: +9 123 456-78-90 вполне себе нормальный индийский номер, с какого лешего он "Fail!".
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40022984
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
mayton
бизнес приходит к программисту

Ну и, вот, у меня к "бузинесу", например, сразу же вопрос: +9 123 456-78-90 вполне себе нормальный индийский номер, с какого лешего он "Fail!".

Беря во внимание что у нас сейчас нед диалога с бизнесом - предлагаю просто порассуждать на тему
критики решения. А тестовый кейс просто воспринимать как данность.

Если что - скорректируем.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40022987
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саму регулярку что писал автор я еще не смотрел. Но КМК если мы будем явно идти от позитивных кейсов - то
мы потеряемся. Нам проще проверить негативные. Тоесть разделить универсум на хорошие телефоны и плохие.
А не так как автор - искать из вселенной немалое и тоже по мощности бесконечное количество вариантов
и потом в остатке получать негативные.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40022998
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так. Еще добавить проверку на парность скобочек, пофиксить ошибку компилляции
и все тесты будут зеленые.

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
def check(text):
    original = text
    chars = "()- "
    for c in chars: 
        text = text.replace(c, "")
    if (text.startswith('1') or (text.find(text,"+",1)) >= 0):
        print('Fail')
    else:
        print(original)

        
check('+7 123 456-78-90')
check('8(123)456-78-90')
check('7(123) 456-78-90')
check('1234567890')
check('123456789')
check('+9 123 456-78-90') 
check('+7 123 456+78=90')
check('+7(123 45678-90')
check('8(123  456-78-90')
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023017
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Саму регулярку что писал автор я еще не смотрел.

Я бы вообще делал без регулярки.
1) убираем из строки все кроме цифр
2) если цифр 11 и начинается на 7 - не делаем ничего
3) если цифр 11 и начинается на 8 - заменяем 8 на 7
4) если цифр 10, то добавляем спереди 7
5) иначе ошибка.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023024
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще - не знаю python. Так. Посмотрел названия строковых функций и как делать foreach.

Кто знает что за херня?

Код: python
1.
2.
3.
4.
5.
6.
Traceback (most recent call last):
  File "phone.py", line 28, in <module>
    check('+7 123 456-78-90')
  File "phone.py", line 22, in check
    if (text.startswith('1') or (text.find(text,"+",1)) >= 0):
TypeError: slice indices must be integers or None or have an __index__ method
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023031
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
разделить универсум на хорошие телефоны и плохие.

С практической точки зрения, проверить "хороший" телефон можно только позвонив на него. Какой смысл в "хорошести" номера, если на него все равно никто не отвечает.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023033
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В топике речь идет о сборе сведений. После того как телефоны собраны - их можно
дать на вход роботу который делает обзвон. Но согласись.. было бы странно роботу
скидывать мусор вообще не проверив ничего.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023060
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично меня задолбали телефонные спамеры, я бы этот топик просто закрыл, но поделюсь методом борьбы с этими уродами: звонок принять, не сбрасывать, просто положить телефон на стол и пусть они кричат "алло". Робот переключит на оператора, оператор поаллокает, эффективность спама упадет.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023070
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Лично меня задолбали телефонные спамеры, я бы этот топик просто закрыл, но поделюсь методом борьбы с этими уродами: звонок принять, не сбрасывать, просто положить телефон на стол и пусть они кричат "алло". Робот переключит на оператора, оператор поаллокает, эффективность спама упадет.

Андроид неплохо детектирует спам по своим БД.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023071
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня бы больше беспокоили не спамеры а коллекторские звонки когда номер не определен.
Интересно зачем мобильные операторы это позволяют.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023075
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверка парности скобочек - была задачей на собес.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023102
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Интересно зачем мобильные операторы это позволяют.
Затем, что сбор долгов - законный бизнес, а сокрытие номера - законная услуга.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023105
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Правильное решение задачи начинается с её правильной постановки. А твое "как бы его мог ввести человек" это не задача, а пепец. Человек "может" ввести его задом наперед в восьмеричном исчислении. Опиши формально, какой формат считается корректным, тогда можно будет о чем-то говорить.
Согласен. Сейчас, в рамках самообучения регулярками, я просто прорешиваю задачи которую нашел в сети. При решении практических задач действительно нужно уточнить требования и сделать грамотную постановку. Здесь же я старался выжать максимум для того, чтобы больше научиться. Поэтому просто делал так чтобы мой результат совпадал с тем что требуется по задаче - это на скрине.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023106
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, прошу прощения, исходник не полный. В начало нужно добавить import re
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023107
АСУ ТПшник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ бы вообще делал без регулярки.
1) убираем из строки все кроме цифр
2) если цифр 11 и начинается на 7 - не делаем ничего
3) если цифр 11 и начинается на 8 - заменяем 8 на 7
4) если цифр 10, то добавляем спереди 7
5) иначе ошибка.
Вот кстати да.
Замечательное решение.
На кой черт проверять всякие дефисы и прочие блажи, которые сделаны для читаемости и или запоминаемости человеком, если по тому же телефону идет тупой дозвон по набору циферок.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023108
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ вообще - не знаю python. Так. Посмотрел названия строковых функций и как делать foreach.
Кто знает что за херня?
mayton, так вроде нет ошибки
text.find("+",1)
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023115
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
mayton
Саму регулярку что писал автор я еще не смотрел.

Я бы вообще делал без регулярки.
1) убираем из строки все кроме цифр
2) если цифр 11 и начинается на 7 - не делаем ничего
3) если цифр 11 и начинается на 8 - заменяем 8 на 7
4) если цифр 10, то добавляем спереди 7
5) иначе ошибка.

у меня так и сделано. Только код страны ($cn) не разбирается, потому что для РФ.
Но в целом, всё что левее 10 цифр - это код страны. Либо придётся ловить дефисы, если код города по длине не 3...
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
// string с телефоном нужно разобрать и превратить в цифры
// $phone_str = любой набор из цифр: +7(916) 366-6222; 9163666222; 916 3666222;
// $minmax: допустимо 10-11 цифр (7 иногда есть)
    function str2arr(&$str, $minmax = [10, 11], $cn = 7)
    {
        $code = $num = 0;
        $phone_str = preg_replace("/[^\d]/", '', substr($str, 0, 25)); // убрать левые символы в телефоне

        if (empty($phone_str))
            {return;}
        
        $strlen = strlen($phone_str);
        if ($strlen < $minmax[0]   && $strlen > $minmax[1])
            {return;}

        $code = (int) substr($phone_str, -10, 3);
        $num = (int) substr($phone_str, -7, 7);
    
        // иногда могут прислать 925 0000000
        if (empty($code)   || empty($num))
            {return;}
            
        return [$cn, $code, $num];
    }


непонятно только, а это как:
авторЯ бы вообще делал без регулярки.
1) убираем из строки все кроме цифр
БЕЗ регулярки?
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023118
vi0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соглашусь, что для проверки номера регулярки можно использовать минимально. Думаю, при они будут уместнее для поиска номеров в тексте.
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023145
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78
непонятно только, а это как:
авторЯ бы вообще делал без регулярки.
1) убираем из строки все кроме цифр

БЕЗ регулярки?
Ну, именно это можно и регуляркой, а можно и без неё. Не знаю, как в питоне, но в шарпе без регулярки это можно как-нибудь так:
Код: c#
1.
string.Concat(phone.Where(c => c is >= '0' and <= '9'))
...
Рейтинг: 0 / 0
Форматирование номера телефона регулярками на питоне
    #40023148
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу этого выражения и моих претензий.

Код: sql
1.
if re.search(r'^(\+)?(?:[78][\s\(]?\d\d\d\)?\s?\d\d\d-?\d\d-?\d\d|\d\d\d\)?\s?\d\d\d-?\d\d-?\d\d)$', text) == None:



Существуют метрики сложности кода. Они оценивают количество циклов и ветвлений и количество
уникальных сущностей типа переменная или функция. Это не для регулярок а для простых
императивных языков где есть if-else-switch-while-for-dowhile...e.t.c

Они также оценивают мозговые усилия человека по анализу или прочтению кода.

В данном конкретном случае - компактность записи регулярки в 1 строку - это некий самообман.
Здесь мы используя квантовую механику регулярок сжали целый алгоритм парсера и описали в строке.
И это есть проблема.

На самом деле программисту удобно изучать код описаный короткими записями с отступами (эдакий себе Haskell/Lisp/Python style)
при котором вложение описывается как глубина отступа от края листа.

Изучать - же это выражение - сложно. Нам как-бы хочется вставить туда перенос.
Я обычно добавляю смысловые метки наподобие.

Код: sql
1.
(?<mobile_operator_prefix>(\d{1,3})\


и переводы строк после каждой группы с меткой.

Это позволяет ориентироваться по смыслам.

Писать-же 100% логики в регулярке - это как экспериментировать с brainfck. Оно работает - но
разработчик тратит больше ценных человеко-часов на анализ проблем впоследствии.

И это та причина по которой Perl исходники обычно non-supportable и умирают будучи вытесняемыми
более простыми и понятными языками в сегменте веба например.
...
Рейтинг: 0 / 0
25 сообщений из 98, страница 1 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Форматирование номера телефона регулярками на питоне
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]