Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 5, 2018 12:05:25

hubble
Зарегистрирован: 2013-10-11
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Здравствуйте.
Есть такой код. Не уверен в том, что он хороший/оптимальный.
Но находит по шаблону вроде бы все номера. Т.е. первое число всегда находит во всех комбинациях номера. Но все номера (через findall) не получается найти. Показывает только “группу 1” по каждому из номеров.
Что не правильно?

 import re
phone_number = '38 096 123 45 67  38 096 123 4567  38 096 1234567  3809 61234567 \
               38(096)1234567  38(096)123 4567  38(096)1 234567  380 961 234 567  380961234567\
               +38(096) 123 45 67  (096)1234567  (096)-123-45-67  (096)123-45-67  38-096-123-45-67\
               +380961234567'
number = re.search(r"(\(?\+?\d\)?\d?\s?\-?)+\d+", phone_number)[0]
# number = re.findall(r"(\(?\+?\d\)?\d?\s?\-?)+\d+", phone_number)
print(number)
Заранее благодарен.

Отредактировано hubble (Фев. 5, 2018 12:07:55)

Офлайн

#2 Фев. 5, 2018 13:11:04

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

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

А почему ты split() по двум пробелам не сделаешь?



Офлайн

#3 Фев. 5, 2018 15:50:51

hubble
Зарегистрирован: 2013-10-11
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Спасибо.
По твоей рекомендации все получилось. Но я допустил стратегическую ошибку - надо было написать именно ТОТ текст, который будет разбираться - так бы картина была полной. А я только запутал.
В общем текст такой:

 <span class="block">38 096 123 45 67</span> <span class="block">38 096 123 4567</span>
<span class="block">38 096 1234567</span> <span class="block">3809 61234567</span>
<span class="block">38(096)1234567</span> <span class="block">38(096)123 4567</span>
<span class="block">38(096)1 234567</span> <span class="block">380 961 234 567</span>
<span class="block">380961234567</span> <span class="block">+38(096) 123 45 67</span>
<span class="block">(096)1234567</span> <span class="block">(096)-123-45-67</span>
<span class="block">(096)123-45-67</span> <span class="block">38-096-123-45-67</span>
<span class="block">+380961234567</span> <span class="block">+380961 234567</span>
Пока так сразу с первого пинка не получилось сплитнуть.

Отредактировано hubble (Фев. 5, 2018 15:52:07)

Офлайн

#4 Фев. 5, 2018 15:59:19

hubble
Зарегистрирован: 2013-10-11
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Разобрался. Получилось.

 re.split(r"<\D*>", source)

Офлайн

#5 Фев. 5, 2018 22:34:19

hubble
Зарегистрирован: 2013-10-11
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Все хорошо, но результатом работы скрипта получается список из четырех (?) элементов. Первый и последний элементы - пустые.
Это результат работы регулярки ? Не пойму, откуда они взялись?

 import re
phone_number = '<span class="block">38 096 123 45 67</span> <span class="block">38 096 1234567</span>'
number = re.split(r"<\D+>", phone_number)
print('{}: {}'.format(phone_number, number))

Отредактировано hubble (Фев. 5, 2018 22:36:20)

Офлайн

#6 Фев. 6, 2018 00:02:03

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

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

ежели с тэгами, проще xpath

 >>> from lxml import html
>>> tree = html.fromstring(doc)
>>> path = tree.xpath('//span')
>>> [i.text for i in path if i.text]
['38 096 123 45 67', '38 096 123 4567', '38 096 1234567', '3809 61234567', '38(096)1234567', '38(096)123 4567', '38(096)1 234567', '380 961 234 567', '380961234567', '+38(096) 123 45 67', '(096)1234567', '(096)-123-45-67', '(096)123-45-67', '38-096-123-45-67', '+380961234567', '+380961 234567']

Офлайн

#7 Фев. 6, 2018 03:00:08

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

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

hubble
В общем текст такой:
Разбирай его как html. В каком-нибудь номере может быть и много пробелов.
Если же надо через регулярные выражения разобрать такое, то сначала нужно по максимуму всё очистить и потом уже очищенное разбирать. А в очистку входит не только удаление тегов, но и сжатие всех групп пробелов до одного пробела, а ещё замена дефисов на пробелы; при этом скобки, означающие код города, остаются неизменными. Ну то есть не нужно всё делать сразу, делай всё поэтапно. Тогда для очистки подойдут одни регулярные выражения (простые по своей сути), а для последующего разбора подойдут другие регулярные выражения (простые по своей сути). А когда смешиваешь, получается болото, а в болоте ошибки прячутся, невидимые на первый взгляд. Это общий подход при разработке вообще любых программ, работающих с любыми данными любым образом.



Офлайн

#8 Фев. 6, 2018 10:36:03

hubble
Зарегистрирован: 2013-10-11
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

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

To py.user.next:
Спасибо за идею с подходом решения.
To vic57:
Благодарю тоже за предложение решения.

С меня по плюсу.

Отредактировано hubble (Фев. 6, 2018 10:37:14)

Офлайн

#9 Фев. 7, 2018 14:01:06

Vladimirv
Зарегистрирован: 2013-03-22
Сообщения: 108
Репутация: +  7  -
Профиль   Отправить e-mail  

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

Если бы я решал такую задачку, то привел бы все номера к виду: 961234567 а потом бы засетил список. Сделать это можно как через регекспы, так и через методы класса str.

Офлайн

#10 Фев. 7, 2018 17:30:18

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

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

hubble
Это результат работы регулярки ?
да
 >>> import re
>>> s ='q1w2e3r4'
>>> re.split(r'[0-9]',s)
['q', 'w', 'e', 'r', '']
>>> re.split(r'[^0-9]',s)
['', '1', '2', '3', '4']
>>> 


Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version