Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 22, 2021 17:10:49

Nikita21z
Зарегистрирован: 2021-08-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа регулярного выражения

Привет!
У меня есть вот такой скрипт, который парсит разные данные с сайтов, которые сможет найти.
Прикрепил два файлика:
Исходный файл
Скрипт

Проблема заключается в том, что регулярное выражение на номер телефона тут слабое и я нашел в интернете более сложное, которое находит большую выборку.
Но, если я ему заменяю, то он перестается вообще искать. Что только не попробовал, все равно в итоге пустой столбец

Подскажите, пожалуйста, в чем именно может быть проблема и в какую сторону копать

Прикреплённый файлы:
attachment parser1.py (2,8 KБ)

Офлайн

#2 Авг. 22, 2021 17:11:07

Nikita21z
Зарегистрирован: 2021-08-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа регулярного выражения

Исходный файл

Прикреплённый файлы:
attachment 2021-08-16_stom.csv (6,5 KБ)

Офлайн

#3 Авг. 22, 2021 17:14:05

Nikita21z
Зарегистрирован: 2021-08-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа регулярного выражения

Меняю вот на такое рв:
/^(\+)?(\(\d{2,3}\) ?\d|\d)((?\d)|( ?\(\d{2,3}\) ?)){5,12}\d$/

Офлайн

#4 Авг. 22, 2021 18:19:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Работа регулярного выражения

Это регулярка для перла



Офлайн

#5 Авг. 22, 2021 20:16:27

Nikita21z
Зарегистрирован: 2021-08-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа регулярного выражения

doza_and
Это регулярка для перла
А как их отличать?
А мне для чего нужна?
Заранее спасибо за ответ, если вопросы глупые и очевидные)

Офлайн

#6 Авг. 22, 2021 21:00:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Работа регулярного выражения

Nikita21z
Меняю вот на такое рв:
/^(\+)?(\(\d{2,3}\) ?\d|\d)((?\d)|( ?\(\d{2,3}\) ?)){5,12}\d$/
Лучше удали из номера пробелы и дефисы, а потом используй простое регулярное выражение для теста.



Офлайн

#7 Авг. 22, 2021 21:07:33

Nikita21z
Зарегистрирован: 2021-08-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа регулярного выражения

py.user.next
Хмм, так я номера ищу на сайтах парсером, как я удалю дефисы и пробелы
Я наоборот хочу заменить на это регулярное выражение, так как оно очень универсальное и находит номера со всеми символами

Офлайн

#8 Авг. 22, 2021 22:07:31

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Работа регулярного выражения

Nikita21z
А как их отличать?
По слешам в начале и конце
Nikita21z
А мне для чего нужна?
А нам то откуда знать чего вы хотите?
Nikita21z
так как оно очень универсальное и находит номера со всеми символами
Если бы оно это делало то вы бы ничего не спрашивали. Вам дело советуют. Будьте проще, разбивайте задачу на подзадачи. Тогда вы сможете разобраться в более простой регулярке и поддерживать работоспособность своего кода.



Офлайн

#9 Авг. 23, 2021 02:04:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Работа регулярного выражения

Nikita21z
py.user.next
Лучше удали из номера пробелы и дефисы, а потом используй простое регулярное выражение для теста.
Хмм, так я номера ищу на сайтах парсером, как я удалю дефисы и пробелы
Я наоборот хочу заменить на это регулярное выражение, так как оно очень универсальное и находит номера со всеми символами
Чтобы точно выбирать телефонные номера, нужно из текста сначала выбрать последовательности симоволов, похожие на телефонные номера. Для этого не регулярные выражения надо использовать, а конечный автомат. После того как такая последовательность найдена, её нужно почистить от лишних символов (пробелы, дефисы, скобки). А уже потом надо применить к ней регулярное выражение и уже точно знать, телефонный номер это или нет.

Пример
1. видишь такой текст
текст текст 982+928 34(9)8 текст текст
2. выбираешь из него
982+928 34(9)8
3. чистишь это от пробелов, дефисов и скобок
982+9283498
4. проводишь тест по регулярному выражению ^(\+\d|8)\d{10}$
False
1. видишь такой текст
текст текст +7 (982)-928-34-98 текст текст
2. выбираешь из него
+7 (982)-928-34-98
3. чистишь это от пробелов, дефисов и скобок
+79829283498
4. проводишь тест по регулярному выражению ^(\+\d|8)\d{10}$
True

Как выполнить второй пункт: просто берёшь каждый символ и смотришь, буква это или нет. Можешь выбирать только плюсы, минусы, цифры и круглые скобки. Если не буква то добавляешь в накопительную строку. Если буква, то не добавляешь её, а просто накопленную строку отправляешь на очистку и проверку. Если накопленная и почищенная после этого строка оказалась номером телефона, то сохраняешь его. Можешь, конечно, сохранять все эти накопленные строки в промежуточный файл и потом по этому файлу несколькими разными алгоритмами проходить, чтобы всё, похожее на номера телефонов, выбрать максимально точно.

При этом, если ты отобрал номера, то не факт, что это валидные номера в международном смысле. Например, есть номера +3, но нет номеров +0. То есть тебе потребуется потом ещё и по этому принципу их чистить. Так что пытаться уложиться в одну строчку, чтобы найти номер, - довольно наивная затея. Программирование в том и заключается, что ты пишешь то, что надо, а не то, что красиво. А в данном случае получается такой процесс последовательных фильтраций и тестов, который приводит к очень точной выборке валидных данных, с которыми дальше можно надёжно работать.



Отредактировано py.user.next (Авг. 23, 2021 14:00:39)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version