Регулярное выражение под почтовый адрес

Lancellot

Новичок
Пользователь
Апр 30, 2020
22
4
3
Необходимо из почтового адреса вида:

Ленину В.И.
ул. Крупской, д. 12, кв. 22
141500, Москва

Вытащить и сохранить в переменную для:
1) индекс
2) Город
3) Улица
4) дом
5) квартира

Аналогично и под шоссе, тупик, переулок.
Набор текста для теста имеется.

Бюджет: 3т.р. + премия?
 

Asgardov

Пользователь
Пользователь
Май 23, 2020
38
10
8
Больше примеров можете предоставить?
Переносы сохранены?
Нужна ли нормализация?

Что значит:
Аналогично и под шоссе, тупик, переулок.

Мало данных для анализа.

Набор текста для теста имеется.
Почему бы не предоставить его сразу? Как минимум записей 20-30 из разных частей надрать чтоб можно было прикинуть.
 

Lancellot

Новичок
Пользователь
Апр 30, 2020
22
4
3
Почему бы не предоставить его сразу? Как минимум записей 20-30 из разных частей надрать чтоб можно было прикинуть.
Предоставляю:
Код:
-------------------------------
Генеральному директору
ООО «Порше Русланд»

Вернеру Томасу Штэрцелю
Ленинградское шоссе 71А, стр.10,
Москва 125445

-------------------------------
Представителю
конкурсного управляющего
АКБ «ЕНИСЕЙ» (ПАО)

А.Ф. Малахову

ул. Республики, д. 31,
г. Красноярск,
Красноярский край,
Россия, 660075
---------------------------------
Генеральному директору

АО «Строительно-монтажное
управление № 100»

Р.С. Лысенко

Рижский 1-й переулок, д.6А,
Москва, 129626
---------------------------------
Финансовому управляющему
имущественного должника
Щекастой Е.В.

Д.А. Петрову

а/я 121095, г. Красноярск, 660041
------------------------------------
Генеральному директору

АО «Международный
аэропорт «Внуково»

Д.И. Сапрыкину

д. 12, ул. 1-ая Рейсовая,

п. Внуково, г. Москва, 119027
---------------------------------
Шапито Ю.Ю.
Ленинградское ш., д.104,
кв. 17, г. Москва, 125195
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Универсальное решение сделать сразу вряд ли получится. Так как возможно большое количество частных случаев.
Ниже привел частное решение под данную выборку примеров. Можно попробовать начать с частного варианта и по мере необходимости дополнять его под частные случаи. Потом постепенно обобщать их в методы и классы. В итоге получится мини-фреймворк для парсинга почтовых адресов.
Вот код:
Python:
import re


s = ['''-------------------------------
Генеральному директору
ООО «Порше Русланд»

Вернеру Томасу Штэрцелю
Ленинградское шоссе 71А, стр.10,
Москва 125445

-------------------------------''',
'''Представителю
конкурсного управляющего
АКБ «ЕНИСЕЙ» (ПАО)

А.Ф. Малахову

ул. Республики, д. 31,
г. Красноярск,
Красноярский край,
Россия, 660075
---------------------------------''',
'''Генеральному директору

АО «Строительно-монтажное
управление № 100»

Р.С. Лысенко

Рижский 1-й переулок, д.6А,
Москва, 129626
---------------------------------''',
'''Финансовому управляющему
имущественного должника
Щекастой Е.В.

Д.А. Петрову

а/я 121095, г. Красноярск, 660041
------------------------------------''',
'''Генеральному директору

АО «Международный
аэропорт «Внуково»

Д.И. Сапрыкину

д. 12, ул. 1-ая Рейсовая,

п. Внуково, г. Москва, 119027
---------------------------------''',
'''Шапито Ю.Ю.
Ленинградское ш., д.104,
кв. 17, г. Москва, 125195''',
'''Ленину В.И.
ул. Крупской, д. 12, кв. 22
141500, Москва''']

zipcodes = []
flats = []
houses = []
cities = []
streets = []
for text in s:
    zip_code = re.findall(r"[^a\/я] \b(\d{6})\b", text)
    if bool(zip_code):
        zipcodes.append(zip_code[0])

    kvartira = re.findall(r"(кв\. \d+)", text)
    if bool(kvartira):
        flats.append(kvartira[0])

    dom = re.findall(r"(д\W+\d+\w+)", text)
    stroenie = re.findall(r"(\d+\w+\,\s\w+\S\d+\w+)", text)
    if bool(dom):
        houses.append(dom[0])
    if bool(stroenie):
        houses.append(stroenie[0])

    city = re.findall(r"(\d{6})\S\s([А-Я]\w+)", text)
    if bool(city):
        cities.append(city[0][1])
    else:
        city2 = re.findall(r"г\W+\w+", text)

        if bool(city2):
            cities.append(city2[0].replace('г. ', ''))
        else:
            city2 = re.findall(r"([А-Я]\w+\S)\s(\d{6})", text)[0]
            if bool(city2):
                cities.append(city2[0].replace(',', ''))

    street = re.findall(r'ул. [а-яА-Я]+', text)
    if bool(street):
        streets.append(street[0])

    street2 = re.findall(r'ул.\s+\S+\w+\s\w+', text)
    if bool(street2):
        streets.append(street2[0])

    street3 = re.findall(r'\w+ ш\S\w+', text)
    if bool(street3):
        streets.append(street3[0])

    street4 = re.findall(r'\w+ ш\.', text)
    if bool(street4):
        streets.append(street4[0])

    street5 = re.findall(r'\w+\S\s\d\S\w\sпереулок', text)
    if bool(street5):
        streets.append(street5[0])

print('-' * 20)
print('Индексы')
print('-' * 20)
for i in zipcodes:
    print(i)

print('-' * 20)
print('Квартиры')
print('-' * 20)
for i in flats:
    print(i)

print('-' * 20)
print('Дома')
print('-' * 20)
for i in houses:
    print(i)

print('-' * 20)
print('Города')
print('-' * 20)
for i in cities:
    print(i)

print('-' * 20)
print('Улицы')
print('-' * 20)
for i in streets:
    print(i)
 
  • Мне нравится
Реакции: Lancellot

Lancellot

Новичок
Пользователь
Апр 30, 2020
22
4
3
Можно попробовать начать с частного варианта и по мере необходимости дополнять его под частные случаи. Потом постепенно обобщать их в методы и классы.
Я именно так и предполагал, что под уникальный случай свой паттерн будет! Спасибо, буду сегодня тестировать.
 

Форум IT Специалистов