If-Else правила для жесткого кода парсинга адреса - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу начать с жестко запрограммированной структуры на основе правил в Python, желательно используя IF-ELSE для решения следующих проблем:

Например, я правильно отформатировал

UK postal address:
Flat 8, The Apartment, King Philip Street, SE1 3WX

Различные варианты, которые могут быть получены из вышеуказанного фактического адреса:

Эти ориентированы на первую строку вариантов адреса:

Flat 8 - Actual
8
F8
f8
flat 8
flat8
FLAT8
FLAT 8

Эти фокусируются на второй строке вариаций адреса:

The Apartment - Actual
Apartment, 
TheApartment
theapartment
the apartment

Эти фокусируются на третьей строке вариантов адреса:

King Philip Street - Actual
King Philip St
King Philip st
King Philip street
King Philip STREET
king philip St
king philip st
king philip street
king philip STREET

Эти фокусируются на четвертой строке вариаций адреса:

SE1 3WX - Actual
SE13WX
SE1 3WX
se1 3wx
se13wx

Следовательно, функция Python должна иметь возможность анализировать и выводить вышеупомянутые сегментированные результаты, как только адрес введен в функцию.

У меня есть несколько тысяч таких адресов, которые также должны быть проанализированы.

Кто-нибудь делал что-то подобное раньше, может кто-нибудь помочь мне показать, как этого можно достичь?

ИСПОЛЬЗОВАНИЕ ОБРАЗЦОВ ФУНКЦИЙ:

Python_Function("Flat 8, The Apartment, King Philip Street, SE1 3WX, England")

Вывод должен быть:

Адрес первой строки:

Flat 8
8
F8
f8
flat 8
flat8
FLAT8
FLAT 8

Адрес второй строки:

The Apartment
Apartment
TheApartment
theapartment
the apartment

Адрес третьей строки:

King Philip Street
King Philip St
King Philip st
King Philip street
King Philip STREET
king philip St
king philip st
king philip street
king philip STREET

адрес четвертой строки:

SE1 3WX
SE13WX
SE1 3WX
se1 3wx
se13wx

Адрес пятой строки:

England
england
eng

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Откажитесь от жестко закодированного подхода для более общего подхода.

Я обеспечил начало (логика для квартиры и квартиры).Надеюсь, вам удастся сделать все остальное самостоятельно.

import re
from itertools import product

digits_regex = re.compile('\d+')

address = "Flat 8, The Apartment, King Philip Street, SE1 3WX, England"

def generate(full_address):
    def generate_flat(flat_number, prefixes=('f', 'flat')):
        flat_options = [str(flat_number)]
        for prefix in prefixes:
            flat_options.append('{}{}'.format(prefix, flat_number))
            flat_options.append('{} {}'.format(prefix, flat_number))
            flat_options.append('{}{}'.format(prefix.upper(), flat_number))
            flat_options.append('{} {}'.format(prefix.upper(), flat_number))
        return flat_options

    def generate_apartment(apartment):
        prefix, *rest = apartment.split()
        joined = ''.join((prefix, *rest))
        return [apartment, rest[0], joined, joined.lower(), ' '.join((prefix.lower(), *map(str.lower, rest)))]

    flat, apartment, street, area, country = full_address.split(', ')

    return [', '.join(variation) for variation in product(generate_flat(digits_regex.findall(flat)[0]), generate_apartment(apartment))]


for variation in generate(address):
    print(variation)

Вывод

8, The Apartment
8, Apartment
8, TheApartment
8, theapartment
8, the apartment
f8, The Apartment
f8, Apartment
f8, TheApartment
f8, theapartment
f8, the apartment
f 8, The Apartment
f 8, Apartment
f 8, TheApartment
f 8, theapartment
f 8, the apartment
F8, The Apartment
F8, Apartment
F8, TheApartment
F8, theapartment
F8, the apartment
F 8, The Apartment
F 8, Apartment
F 8, TheApartment
F 8, theapartment
F 8, the apartment
flat8, The Apartment
flat8, Apartment
flat8, TheApartment
flat8, theapartment
flat8, the apartment
flat 8, The Apartment
flat 8, Apartment
flat 8, TheApartment
flat 8, theapartment
flat 8, the apartment
FLAT8, The Apartment
FLAT8, Apartment
FLAT8, TheApartment
FLAT8, theapartment
FLAT8, the apartment
FLAT 8, The Apartment
FLAT 8, Apartment
FLAT 8, TheApartment
FLAT 8, theapartment
FLAT 8, the apartment
0 голосов
/ 01 апреля 2019

Вот краткий обзор некоторых инструментов, которые могут быть полезны (не делая все на своем месте):

for i,field in enumerate(input.split(', ')):
    lower_case = field.lower()
    upper_case = field.upper()
    capital = field.proper()
    without_spaces = field.replace(' ','') # you can remove spaces for above as well

    #then you can had specifics
    if i == 1:
        only_first_three = field[:3]

    #now if someones really writes weirdly:
    splitted_field = field.split(' ')
    random_capitals = [ word.proper() for word in splitter_fields if ...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...