Найти - Пользователи
Полная версия: Регулярное выражение не отрабатывает корректно
Начало » Python для новичков » Регулярное выражение не отрабатывает корректно
1
hubble
Здравствуйте.
Есть такой код. Не уверен в том, что он хороший/оптимальный.
Но находит по шаблону вроде бы все номера. Т.е. первое число всегда находит во всех комбинациях номера. Но все номера (через 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)
Заранее благодарен.

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

С меня по плюсу.
Vladimirv
Если бы я решал такую задачку, то привел бы все номера к виду: 961234567 а потом бы засетил список. Сделать это можно как через регекспы, так и через методы класса str.
vic57
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']
>>> 


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