Форум сайта python.su
0
Исходные:
ось - Win XP SP3
питон - 2.7
Предисловие:
Стоит задача из строки (строка одна!) выделить телефонные номера. Номера могут быть записаны разнообразно, пишут посетители собственными силами, сами понимаете, каждый дышит как он слышит. При этом сами номера могут быть записаны в принятых по количеству цифр международном, междугородном и городском форматах, уточняю местоположение - Укрина, г.Киев: +380123456789 или 0123456789 или 1234567 соответственно. Количество пробелов или существование разделителей предположить не представляется возможным. Глазами читается все на ура. Осталось “эти глаза” прикрутить лушпайке которая тоже будет видеть все номера.
Собственно:
Впервые столкнулся с регулярками. Казалось бы начал понимать и привыкать к синтаксису. Отладил в RegExr одно выражение с применением метасимвола | (вертикальная черта - ИЛИ). А вот когда подсунул это выражение методу findall то он вывалил результат в виде списка кортежей строк вместо простого списка строк. Очень даже просматривается закономерность в кортеже. Тому выражению в регулярке которое не сработало соответствует пустая строка в кортеже (левое-правое, соответственно 1-е или 2-е).
! Наверное так и было задумано в регулярках питона, НО как это можна обойти ?
Ведь мне нужен список строк иначе переборка кортежей сводит на НЕТ использование преимуществ регулярки :(
И чем “дальше в лес”, тем больше склоняюсь к мысли что одними регулярками такие номерочки не вытащить, все таки придется итерировать…
А может кто опытом поделится … буду очень признателен!
P.S.
На сайте ХАБРАХАРОВЦЕВ … или как их там называют … есть один блог по регуляркам на тему приблизительно - “регулярка по телефонным номерам”, там есть примеры толковые, но все равно у меня ловят только 90%. Кста у них там какая то система непроходимая по смыслу с рейтингами и называют они их точно также. Короч… даже комент оставить не удалось, а хотел положительно написать. Перемудрили они, как мне кажется, а может таким образом ограничивают количество акаунтов…. ХЗ. Однако толковых статей много !
Привет АБРАКАДАБРОВЦАМ, т.е. ХАБРАХАРОВЦАМ или АРХАРОВЦАМ… или как вас там ? :) Отличные у вас статьи… в отличии от названия ресурса.
Отредактировано (Янв. 23, 2012 18:49:24)
Офлайн
253
Обычно такую проблему решают не регулярками а MaskEdit тогда пользователь просто не может неправильно записать номер.
Претензия на счет кортежей непонятна
>>> import re
>>> re.findall("a|b","aaabbba")
['a', 'a', 'a', 'b', 'b', 'b', 'a']
>>> [i.group(0) for i in re.finditer("((a)|(b))","aaabbba")]
['a', 'a', 'a', 'b', 'b', 'b', 'a']
Отредактировано (Янв. 23, 2012 19:00:38)
Офлайн
0
О !
скобки
у меня скобок не хватет … ща попоробую
5 мин…
так и есть, не хватало скобок оборачивающих все выражение ИЛИ
получил чистый список строк
СПАСИБО !
как у Ленина: век живи и … учись, учись, учись … ну продолжение знаете :)
Отредактировано (Янв. 23, 2012 19:12:35)
Офлайн
253
Несмотря на скобки желательно прочитать про регулярки. Скобки размечают то, что нашлось. В моем примере валидны group(0),group(1),group(2). Я скобками выделил все - вот и получил то что нашлось. Вам еще обрабатывать случай когда вообще ни с чем не совпадет.
Офлайн
0
Я ж, писал, в RegExr показывало все на ура, а в общей массе документа о регулярках питона особо не налегают на том факте ЧТО должен возвращать findall и в каких случаях. Вы мне указали на нюанс который много чего проясняет.
Офлайн