Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для VistaSV30
988 / 332 / 79
Регистрация: 10.04.2012
Сообщений: 1,242
Записей в блоге: 4

Форматирование название улицы

18.09.2021, 01:20. Показов 3188. Ответов 12

Студворк — интернет-сервис помощи студентам
Добрый день!

В почтовых адресах бывает элемент - "просек"
Проблема в том, что номер просека может записываться в двух вариантах, например:
- "1-й просек"
- "просек 1-й"

Диапазон номеров от 1 до 99


Примеры:
Микрорайон Никольско-Архангельский, просек 1-й, д. 14
Мкр. Железнодорожный, 12-й просек, кв-л Живописный, д. 3, лит. а,


Подскажите как получить вариант с номером в начале, например - "1-й просек" ?


Пробую искать ближайшую цифру в строке к слову "просек", но получается какая-то путаница с индексами
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2021, 01:20
Ответы с готовыми решениями:

Заменить название улицы на стандартное
Добрый день! Нужно заменить различные названия улиц на стандартное, типа: Мкр. Никольский, Улица 12-й Просек, д.14 import regex as...

Создать структуру, содержащую название улицы и количество жильцов
Список содержит число жителей, проживающих в каждом доме на пяти улицах села. 1. Создать структуру, содержащую название улицы, номер...

Создать структуру, содержащую название улицы, номер дома, количество жильцов
Добрый вечер! У меня небольшая проблемка) Если кто нибудь подскажет решение,буду рада! Вот задача: Список содержит число жителей,...

12
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
18.09.2021, 05:13
Доброго времени, самый примитивный вариант, но к вам еще обязательно зайдут маги регулярок, коим я к сожалению не являюсь.

Python
1
2
3
4
5
6
a = 'Микрорайон Никольско-Архангельский, просек 99-й, д. 14'
b = [i for i in a.split(', ')]
for i in range(len(b)):
    if b[i].startswith('просек'):
        b[i] = b[i][7:] + ' ' + b[i][:6]
print(', '.join(b)
1
 Аватар для VistaSV30
988 / 332 / 79
Регистрация: 10.04.2012
Сообщений: 1,242
Записей в блоге: 4
18.09.2021, 07:56  [ТС]
enx, спасибо за ответ.

Некоторые мои соображения:
Единственным более-менее надежным признаком номера просека является окончание "-й" после номера. Попробую с этим признаком что-то сделать. Хотя можно и написать "просек-1" или "1-просек"

Вчерашний мой вариант - искать ближайшую цифру рядом со словом "просек" не подходит. Ближе номера просека может оказаться номер дома. И разделителем элементов адреса может быть пробел, а не запятая...
0
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
18.09.2021, 08:53
VistaSV30, а зачем, смотрите, у вас могут быть 2 ситуации насколько я понял:

1. Элемент адреса начинается на 0 индексе с 'просек'. ( .startswith() ) = 'просек 1-й'
2. Элемент адреса заканчивается с N индекса на 'просек'. ( .endswith() ) = '12-й просек'

Бывают другие?

Добавлено через 1 минуту
Если бывают, кидайте примеры, гляну как сделать более универсально, но то, что я написал выше, работает при условии соблюдения форматирования разделителя, что там будет дальше после этого слова - не важно, развернет по срезам.
0
 Аватар для VistaSV30
988 / 332 / 79
Регистрация: 10.04.2012
Сообщений: 1,242
Записей в блоге: 4
18.09.2021, 08:55  [ТС]
В разных базах данных могут быть разные варианты и каждый отдельный человек может проявить фантазию и как-то по своему написать адрес.

Спасибо за предложение, сейчас отойду на часок. Вернусь попробую еще варианты
0
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
18.09.2021, 08:59
А могут быть ситуации, когда просек входит в строку более, чем 1 раз?
0
 Аватар для VistaSV30
988 / 332 / 79
Регистрация: 10.04.2012
Сообщений: 1,242
Записей в блоге: 4
18.09.2021, 09:08  [ТС]
С городами, поселками, сёлами и т.п. такое бывает. г. Троицк был включен в состав Москвы и теперь могут попадаться адреса
"г. Москва, г. Троицк, ул. ....". С просеками такого пока мне не встречалось.

Я нашел такие варианты написания просека:
Python
1
2
3
4
5
6
7
8
9
10
11
def Просек(Nm = '', Conv = 0): # Conv: 0 - эталонное сокращение; 1 - исходное сокращение
    patt = [' просек ',' просек.','-просек.', 'просек.-', ' -просек ', ' просек- ', '']
    Nm = ' '.join(Nm.split())  # удаление лишних пробелов
    Nm = ' ' + Nm + ' '
    nm = Nm.lower()
    for count, item in enumerate(patt):  # поиск совпадений val in enumerate(seq, start=1):
        if (item in nm): break
 
    if (item != ''): # номер просека
        # позже допишу...
        pass
0
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
18.09.2021, 09:15
Держите так, чтобы вы вообще о разделителях не переживали, но повторю, import re позволяет сделать это в строку, я с этой библиотекой не работаю вообще, ибо мне циферки и матрицы нужны. Но вам она точно поможет.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def parse_key_word(x: str) -> str:
    if 'просек' in x.lower():
        ind_1 = x.lower().find('просек')  # индекс первого вхождения слова
        ind_2 = x[ind_1:].lower().find('-й')  # индекс первого вхождений -й после слова просек
        tmp_word = x[ind_1:ind_1 + ind_2 + 2]  # вырезаем часть от просек до -й
        return x[:ind_1] + tmp_word[6:] + ' ' + tmp_word[:6] + x[ind_1 + ind_2 + 2:]  # разворачиваем и склеиваем
    else:
        return x
 
 
a = 'Микрорайон,./,./Никольско-,./,.Архангельский..,./просек1123-й3151351д.14'
print(a)
print(parse_key_word(a))
1
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
18.09.2021, 09:52
Больше кейсов надо. Но вот так вроде относительно универсально. Части адреса (город, улица и проч. разделены запятыми).
Python
1
2
3
4
5
6
7
8
9
10
import regex as re
 
lst = ["Микрорайон Никольско-Архангельский, просек 99-й, д. 14",
       "Мкр. Железнодорожный, 12-й просек, кв-л Живописный, д. 3, лит. а,",
       "24 Мкр. Железнодорожный, ПрОсЕк 22, кв-л Живописный, д. 3, лит. а,"]
 
for s in lst:
    print(re.search(r'(?i)(?<=просек[^,]*?)\d+|\d+(?=[^,]*?просек)', s).group())
    
# 99 12 22
1
enx
 Аватар для enx
1190 / 766 / 277
Регистрация: 05.09.2021
Сообщений: 1,772
18.09.2021, 10:02
iSmokeJC, тут еще проблема будет, пока автор не даст выборку на 5-10 примеров, допустим что делать в ситуации, когда у нас так:

Микрорайон Просековсого 14 )))
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
18.09.2021, 10:17
Цитата Сообщение от enx Посмотреть сообщение
что делать в ситуации, когда у нас так:
r'(?i)(?<=\Wпросек\W[^,]*?)\d+|\d+(?=[^,]*?\Wпросек\W)'

Добавлено через 56 секунд
Проблем может всплыть куча, почему я и сказал
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Больше кейсов надо
1
 Аватар для VistaSV30
988 / 332 / 79
Регистрация: 10.04.2012
Сообщений: 1,242
Записей в блоге: 4
18.09.2021, 10:56  [ТС]
Спасибо еще раз за помощь.

Вот несколько вариантов, то что смог пока напридумывать.
Python
1
2
3
4
5
6
7
8
9
10
Addr = [' мкр. Никольско-Архангельский, просек. 1-й, д. 14, Балашиха',
' мкр. Никольско-Архангельский просек. 1-й  д. 14, Балашиха',
' мкр. Никольско-Архангельский просек 1-й  д. 14, Балашиха',
' мкр. Никольско-Архангельский просек-1  д. 14, Балашиха',
' мкр. Никольско-Архангельский,  1-й просек., д. 14, Балашиха',
' мкр. Никольско-Архангельский,  1-й просек, д. 14, Балашиха',
' мкр. Никольско-Архангельский  1-й просек  д. 14, Балашиха',
' мкр. Никольско-Архангельский  1-просек  д. 14, Балашиха',
' мкр. Никольско-Архангельский, просек. 2-ой, д. 14, Балашиха',
' мкр. Никольско-Архангельский, просек. 4-ый, д. 14, Балашиха']
Тут такое правило, что нет каких-либо правил. Главное, чтоб почтальон понял
А как это сделать понятным для компьютера - большой вопрос
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
18.09.2021, 11:14
VistaSV30, ну вот, последняя регулярка все матчит
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2021, 11:14
Помогаю со студенческими работами здесь

Составить базу данных, которая позволяет вводить ФИО человека, название улицы
Составить базу данных, которая позволяет вводить ФИО человека, название улицы. С помощью названия улицы вывести ФИО (название улицы...

Название улицы и номер дома в ячейке написаны слитно. Как вставить пробел между ними?
Часть адресов написаны правильно &quot;улица дом&quot; (например, Мира 72), а часть - нет (Мира72), т.е. отсутствует пробел. Как добавить...

Выдать для каждого адреса имя улицы, не включая тип улицы
Кто может перевести код с С++ на паскаль? пожалуйста. #include &lt;string&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; typedef...

Название улицы и номер дома в ячейке написаны слитно. Как вставить пробел между ними макросом
Часть адресов написаны правильно &quot;улица дом&quot; (например, Мира 72), а часть - нет (Мира72), т.е. отсутствует пробел. Как добавить...

Вывести название улицы которая имеет больше всего домов и общее количество квартир для каждой из улиц
Хелп) Условие В файле записано: название улицы, номер дома, количество квартир. Вывести название улицы которая имеет больше всего...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru