Форум сайта python.su
Здравствуйте.
Есть такой код. Не уверен в том, что он хороший/оптимальный.
Но находит по шаблону вроде бы все номера. Т.е. первое число всегда находит во всех комбинациях номера. Но все номера (через 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)
Офлайн
А почему ты split() по двум пробелам не сделаешь?
Офлайн
Спасибо.
По твоей рекомендации все получилось. Но я допустил стратегическую ошибку - надо было написать именно ТОТ текст, который будет разбираться - так бы картина была полной. А я только запутал.
В общем текст такой:
<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)
Офлайн
Разобрался. Получилось.
re.split(r"<\D*>", source)
Офлайн
Все хорошо, но результатом работы скрипта получается список из четырех (?) элементов. Первый и последний элементы - пустые.
Это результат работы регулярки ? Не пойму, откуда они взялись?
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)
Офлайн
ежели с тэгами, проще 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']
Офлайн
hubbleРазбирай его как html. В каком-нибудь номере может быть и много пробелов.
В общем текст такой:
Офлайн
To py.user.next:
Спасибо за идею с подходом решения.
To vic57:
Благодарю тоже за предложение решения.
С меня по плюсу.
Отредактировано hubble (Фев. 6, 2018 10:37:14)
Офлайн
Если бы я решал такую задачку, то привел бы все номера к виду: 961234567 а потом бы засетил список. Сделать это можно как через регекспы, так и через методы класса str.
Офлайн
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'] >>>
Офлайн