Отделяем адрес от названия организации на Python'е

Создание карты участковых избирательных комиссий
Ответить
bolotoved
Гуру
Сообщения: 920
Зарегистрирован: 30 дек 2008, 14:11
Статьи: 4
Проекты: 1
Репутация: 235
Откуда: Ханты-Мансийск
Контактная информация:

Отделяем адрес от названия организации на Python'е

Сообщение bolotoved » 27 авг 2013, 07:37

Задача: автоматически отделить адрес от названия организации.

После процедуры причесывания имеем адреса вида:

Код: Выделить всё

МБОУ лицей №1, ул.Энтузиастов д.61а
Школа №2, ул. 30 лет Победы, д.39/1, (актовый зал)
ул.Розы Люксембург, д.1, общежитие
ул. Ленина, д.5
Решение:

Код: Выделить всё

import re
src_txt = u'МБОУ лицей №1, ул. Энтузиастов д.61а\nШкола №2, ул. 30 лет Победы, д.39/1, (актовый зал)\nул. Розы Люксембург, д.1, общежитие\nул. Ленина, д.5'
street_list = src_txt.split("\n")
# паттерн поиска адреса от ул. до д.№№
address_pattern = u'(ул\\..*?д\\.\\d.*?(?:\\s|$))' # (?:\\s|$) включить в поиск конец строки [\\n]-включает строку в результат поиска, только если есть перенос строки.
address_list = [re.findall(address_pattern, x, re.U) for x in street_list]
address_list = [''.join(x) for x in address_list]
# создаем матрицу с двумя колонками: 0) "исходный текст"; 1) "вырезанный адрес"
matrix = [street_list, address_list]
# считаем количество строк в матрице
address_number = len(address_list)
# генерируем список вида 0,1,2....
address_number_list = range(0,address_number)
# вырезаем адрес из исходного текста для каждой строки матрицы
organisation_list = [re.sub(matrix[1][x], '', matrix[0][x], re.U) for x in address_number_list]
# объединяем адрес и организацию в результирующую матрицу
result_matrix = [address_list, organisation_list]
result = [result_matrix[0][x] + ' ' + result_matrix[1][x] for x in address_number_list]
result = '\n'.join(result)
print result


Результат:

Код: Выделить всё

ул. Энтузиастов д.61а                  МБОУ лицей №1, 
ул. 30 лет Победы, д.39/1,                   Школа №2, (актовый зал)
ул. Розы Люксембург, д.1,                   общежитие
ул. Ленина, д.5                  
В качестве разделителя, конечно лучше поставить табуляцию ('\\t', а не набор пробелов, которые приведены сдесь для наглядности. Остается только почистить лишние запятые и пробелы (тоже автоматически). Аналогично можно поступить и с телефонами.

Ответить

Вернуться в «УИК ГЕО»