Найти - Пользователи
Полная версия: Регулярные выражения. Метод findall и метасимвол | (верт.черта)
Начало » Python для новичков » Регулярные выражения. Метод findall и метасимвол | (верт.черта)
1
Ginibe
Исходные:
ось - Win XP SP3
питон - 2.7

Предисловие:
Стоит задача из строки (строка одна!) выделить телефонные номера. Номера могут быть записаны разнообразно, пишут посетители собственными силами, сами понимаете, каждый дышит как он слышит. При этом сами номера могут быть записаны в принятых по количеству цифр международном, междугородном и городском форматах, уточняю местоположение - Укрина, г.Киев: +380123456789 или 0123456789 или 1234567 соответственно. Количество пробелов или существование разделителей предположить не представляется возможным. Глазами читается все на ура. Осталось “эти глаза” прикрутить лушпайке которая тоже будет видеть все номера.

Собственно:
Впервые столкнулся с регулярками. Казалось бы начал понимать и привыкать к синтаксису. Отладил в RegExr одно выражение с применением метасимвола | (вертикальная черта - ИЛИ). А вот когда подсунул это выражение методу findall то он вывалил результат в виде списка кортежей строк вместо простого списка строк. Очень даже просматривается закономерность в кортеже. Тому выражению в регулярке которое не сработало соответствует пустая строка в кортеже (левое-правое, соответственно 1-е или 2-е).

! Наверное так и было задумано в регулярках питона, НО как это можна обойти ?
Ведь мне нужен список строк иначе переборка кортежей сводит на НЕТ использование преимуществ регулярки :(

И чем “дальше в лес”, тем больше склоняюсь к мысли что одними регулярками такие номерочки не вытащить, все таки придется итерировать…

А может кто опытом поделится … буду очень признателен!

P.S.
На сайте ХАБРАХАРОВЦЕВ … или как их там называют … есть один блог по регуляркам на тему приблизительно - “регулярка по телефонным номерам”, там есть примеры толковые, но все равно у меня ловят только 90%. Кста у них там какая то система непроходимая по смыслу с рейтингами и называют они их точно также. Короч… даже комент оставить не удалось, а хотел положительно написать. Перемудрили они, как мне кажется, а может таким образом ограничивают количество акаунтов…. ХЗ. Однако толковых статей много !
Привет АБРАКАДАБРОВЦАМ, т.е. ХАБРАХАРОВЦАМ или АРХАРОВЦАМ… или как вас там ? :) Отличные у вас статьи… в отличии от названия ресурса.
doza_and
Обычно такую проблему решают не регулярками а 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']
Если не трудно приведите все - строку регулярку и результат и то какой результат вы хотите получить.
Ginibe
О !
скобки
у меня скобок не хватет … ща попоробую
5 мин…
так и есть, не хватало скобок оборачивающих все выражение ИЛИ
получил чистый список строк

СПАСИБО !

как у Ленина: век живи и … учись, учись, учись … ну продолжение знаете :)
doza_and
Несмотря на скобки желательно прочитать про регулярки. Скобки размечают то, что нашлось. В моем примере валидны group(0),group(1),group(2). Я скобками выделил все - вот и получил то что нашлось. Вам еще обрабатывать случай когда вообще ни с чем не совпадет.
Ginibe
Я ж, писал, в RegExr показывало все на ура, а в общей массе документа о регулярках питона особо не налегают на том факте ЧТО должен возвращать findall и в каких случаях. Вы мне указали на нюанс который много чего проясняет.
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