Найти - Пользователи
Полная версия: Работа регулярного выражения
Начало » Python для новичков » Работа регулярного выражения
1
Nikita21z
Привет!
У меня есть вот такой скрипт, который парсит разные данные с сайтов, которые сможет найти.
Прикрепил два файлика:
Исходный файл
Скрипт

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

Подскажите, пожалуйста, в чем именно может быть проблема и в какую сторону копать
Nikita21z
Исходный файл
Nikita21z
Меняю вот на такое рв:
/^(\+)?(\(\d{2,3}\) ?\d|\d)((?\d)|( ?\(\d{2,3}\) ?)){5,12}\d$/
doza_and
Это регулярка для перла
Nikita21z
doza_and
Это регулярка для перла
А как их отличать?
А мне для чего нужна?
Заранее спасибо за ответ, если вопросы глупые и очевидные)
py.user.next
Nikita21z
Меняю вот на такое рв:
/^(\+)?(\(\d{2,3}\) ?\d|\d)((?\d)|( ?\(\d{2,3}\) ?)){5,12}\d$/
Лучше удали из номера пробелы и дефисы, а потом используй простое регулярное выражение для теста.
Nikita21z
py.user.next
Хмм, так я номера ищу на сайтах парсером, как я удалю дефисы и пробелы
Я наоборот хочу заменить на это регулярное выражение, так как оно очень универсальное и находит номера со всеми символами
doza_and
Nikita21z
А как их отличать?
По слешам в начале и конце
Nikita21z
А мне для чего нужна?
А нам то откуда знать чего вы хотите?
Nikita21z
так как оно очень универсальное и находит номера со всеми символами
Если бы оно это делало то вы бы ничего не спрашивали. Вам дело советуют. Будьте проще, разбивайте задачу на подзадачи. Тогда вы сможете разобраться в более простой регулярке и поддерживать работоспособность своего кода.
py.user.next
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. То есть тебе потребуется потом ещё и по этому принципу их чистить. Так что пытаться уложиться в одну строчку, чтобы найти номер, - довольно наивная затея. Программирование в том и заключается, что ты пишешь то, что надо, а не то, что красиво. А в данном случае получается такой процесс последовательных фильтраций и тестов, который приводит к очень точной выборке валидных данных, с которыми дальше можно надёжно работать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB