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

Neket26

Новичок
Пользователь
Авг 18, 2021
18
0
1
Привет!
У меня есть скрипт, который парсит разные данные с сайтов, которые сможет найти.
Прикрепил два файлика:
Исходный файл
Скрипт

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

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

Пытаюсь заменить вот на такое регулярное выражение:
/^(\+)?(\(\d{2,3}\) ?\d|\d)(([ \-]?\d)|( ?\(\d{2,3}\) ?)){5,12}\d$/
 

Вложения

  • parser.zip
    3,8 КБ · Просмотры: 2

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 590
459
83
попробуйте в простом скрипте это выражение на разных форматах номеров...
оно не работает...
Python:
import re

template = re.compile("/^(\+)?(\(\d{2,3}\) ?\d|\d)(([ \-]?\d)|( ?\(\d{2,3}\) ?)){5,12}\d$/")

data = ["89023335454", "+79034443434", "79025554343", "8-902-333-66-66", "+7-902-333-55-66", "7-900-454-33-33"]


for i in data:
    j = re.search(template, i)
    print("search - " + j[0] if j else "search - Not found")
    j = re.fullmatch(template, i)
    print("fullmatch - " + j[0] if j else "fullmatch - Not found")
    j = re.findall(template, i)
    print("findall - " + j[0] if j else "findall - Not found")
везде будет Not found


вот такая регулярка видит, но не все...
Python:
import re

template = re.compile("(?:\+7|8)(?:-\d{2,3}){4}")

data = ["89023335454", "+79034443434", "79025554343", "8-902-333-66-66", "+7-902-333-55-66", "7-900-454-33-33"]


for i in data:
    j = re.search(template, i)
    print("search - " + j[0] if j else "search - Not found")
    j = re.fullmatch(template, i)
    print("fullmatch - " + j[0] if j else "fullmatch - Not found")
    j = re.findall(template, i)
    print("findall - " + j[0] if j else "findall - Not found")

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

Neket26

Новичок
Пользователь
Авг 18, 2021
18
0
1
Но все равно, даже если написать исправное регулярное выражение, то в вашем примере оно работает
А у меня почему-то снова пустые строчки

import re
template = re.compile('^(\+7|7|8)?[\s\-]?\(?[489][0-9]{2}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$')
data = ['89023335454', '+79034443434', '79025554343', '8-902-333-66-66', '+7-902-333-55-66', '7-900-454-33-33']

for i in data:
j = re.search(template, i)
print("search - " + j[0] if j else "search - Not found")
j = re.fullmatch(template, i)
print("fullmatch - " + j[0] if j else "fullmatch - Not found")
j = re.findall(template, i)
print("findall - " + j[0] if j else "findall - Not found")
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 590
459
83
я выборочно посмотрел сайты, регулярка не совпала с номером на них, на сайтах есть скобки, на одном видел что последнего тире нет, то есть номер такого вида х (ххх) ххх-хххх, где то пробелов нет, где то они есть, где то нет первой цифры, то есть вот так (ххх) ххх-хх-хх...

вам нужно работать над регуляркой, либо делать разные регулярки и проверять их все...

upd
еще я заметил, что вы ищете через findall, но если на мой пример посмотреть он не находит ничего...
используйте search...
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 590
459
83
плюс у вас проблема в парсинге, не на всех сайтах есть номер на главной странице...
регулярка то кстати работает вроде и со скобками...
 

Neket26

Новичок
Пользователь
Авг 18, 2021
18
0
1
плюс у вас проблема в парсинге, не на всех сайтах есть номер на главной странице...
регулярка то кстати работает вроде и со скобками...
Да, она со скобками работает.

А что можно как-то залазить на другие страницы сайта, я этого не знал
 

Neket26

Новичок
Пользователь
Авг 18, 2021
18
0
1
Регулярное выражение я проверял на regex и там все ок отрабатывает. Проблема именно почему-то в работе моего скрипта
 

Neket26

Новичок
Пользователь
Авг 18, 2021
18
0
1
я выборочно посмотрел сайты, регулярка не совпала с номером на них, на сайтах есть скобки, на одном видел что последнего тире нет, то есть номер такого вида х (ххх) ххх-хххх, где то пробелов нет, где то они есть, где то нет первой цифры, то есть вот так (ххх) ххх-хх-хх...

вам нужно работать над регуляркой, либо делать разные регулярки и проверять их все...

upd
еще я заметил, что вы ищете через findall, но если на мой пример посмотреть он не находит ничего...
используйте search...

Я и не говорю о 100% попадание на сайте в поисках, какой-то супер универсальный парсер для все сайтов тоже очень сложно написать, наверное

Я попробовал через search и получил ошибку
1629658002914.png
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 590
459
83
ошибка потому что None нельзя проитерировать, а None потому что он ничего не нашел...
 

Форум IT Специалистов