Уведомления

Группа в Telegram: @pythonsu

#1 Май 29, 2013 15:11:51

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Разделение улицы дома и квартиры регулярным выражением

Есть большой список адресов вида :

Ким 22/32
40 лет Победы 19/111
60 лет СССР 10/16
40 лет Победы 11а/115
Школьная 26а

Требуется разделить улицу , дом , букву и квартиру ( ).
Посоветуйте как или чем это можно сделать ? подойдут ли регулярные выражение или можно обойтись без них ?



Офлайн

#2 Май 29, 2013 19:51:45

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Разделение улицы дома и квартиры регулярным выражением

Проще без регулярок разбить:

In [1]: s = 'asdf asdf 22/32'
 
In [2]: s.rpartition(' ')
Out[2]: ('asdf asdf', ' ', '22/32')
 
In [3]: name, _, number = s.rpartition(' ')
А с квартирой не понял, это через дробь и номера может не быть? Можно так:
In [4]: '19/111'.partition('/')
Out[4]: ('19', '/', '111')
 
In [5]: '19a'.partition('/')
Out[5]: ('19a', '', '')

Офлайн

#3 Май 29, 2013 22:56:08

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Разделение улицы дома и квартиры регулярным выражением

reclosedev
Спасибо , да без регулярок этот пример подходит но нужно отделить букву от подъезда а этой буквы может и не быть, вопрос как определить что последний символ это буква а не цифра ?



Офлайн

#4 Май 30, 2013 06:00:20

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

Разделение улицы дома и квартиры регулярным выражением

>>> import re
>>> 
>>> s = """
... Ким 22/32
... 40 лет Победы 19/111
... 60 лет СССР 10/16
... 40 лет Победы 11а/115
... Школьная 26а
... """
>>> 
>>> lst = re.findall(r'^(.+)\s+(\d+)([^\d/\n]*)/?(\d+)?$', s, re.M)
>>> print(lst)
[('Ким', '22', '', '32'), ('40 лет Победы', '19', '', '111'), ('60 лет СССР', '10', '', '16'), ('40 лет Победы', '11', 'а', '115'), ('Школьная', '26', 'а', '')]
>>>

многословное регулярное выражение
>>> import re
>>> 
>>> s = """
... Ким 22/32
... 40 лет Победы 19/111
... 60 лет СССР 10/16
... 40 лет Победы 11а/115
... Школьная 26а
... """
>>> 
>>> pat = r'''
...     ^
...     (.+)            # street
...     \s+             # street <space> house
...     (\d+)           # house number
...     ([^\d/\n]*)     # optional house letter
...     /?              # optional flat sign
...     (\d+)?          # optional flat number
...     $
... '''
>>> 
>>> lst = re.findall(pat, s, re.X | re.M)
>>> print(lst)
[('Ким', '22', '', '32'), ('40 лет Победы', '19', '', '111'), ('60 лет СССР', '10', '', '16'), ('40 лет Победы', '11', 'а', '115'), ('Школьная', '26', 'а', '')]
>>>



Отредактировано py.user.next (Май 30, 2013 06:08:10)

Офлайн

#5 Май 30, 2013 09:37:04

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Разделение улицы дома и квартиры регулярным выражением

py.user.next
Спасибо за развернутый вопрос все работает :)
Но можно еще пару вопросов для общего понимания:
Знаки вопроса это получается то чего может и не быть в поиске ?
И подскажи каким редактором для регулярных выражений ты пользуешся, в питоне твой пример работает а вот например в этим редакторае нет http://www.rubular.com/



Офлайн

#6 Май 30, 2013 14:46:09

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

Разделение улицы дома и квартиры регулярным выражением

это глюки того редактора (требует экранировать слеши)

^(.+)\s+(\d+)([^\d\/\n]*)\/?(\d+)?$
40 лет Победы 11а/115

Jeck290
И подскажи каким редактором для регулярных выражений ты пользуешся
никаким
есть документация - python.org. re
и воображение, которое развивается с помощью блок-схем



Офлайн

#7 Май 30, 2013 16:31:14

Jeck290
От:
Зарегистрирован: 2010-01-03
Сообщения: 99
Репутация: +  0  -
Профиль   Отправить e-mail  

Разделение улицы дома и квартиры регулярным выражением

cспасибо



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version