Правила If-Else для жесткого кодирования синтаксического анализа адреса

#python #regex #if-statement

#python #регулярное выражение #if-оператор

Вопрос:

Я хочу начать с жестко запрограммированной структуры на основе правил в 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
  

Комментарии:

1. Опубликовать пример вывода?

2. Есть ли причина, по которой вы бы просто не сделали split(',') ?

3. да, то, что сказал @GBrandt, или даже лучше : .split(', ') (чтобы избежать дополнительных пробелов в начале некоторых значений)

4. Split разделит текст и выдаст выходные данные. Но мне также нужны варианты, в которых мне нужно вводить как строчные, так и прописные буквы с пробелами между ними (имитируя то, как люди на самом деле пишут адреса на бумаге).

5. Вы действительно что-нибудь пробовали?

Ответ №1:

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

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

 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
  

Комментарии:

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

2. @Dinesh Тогда все, что вам нужно сделать, это удалить вызов product в конце generate и просто распечатать выходные данные функций generate_flat и generate_apartment .

3. действительно извините, я пробовал разные методы, это не работает. Я определенно делаю что-то не так. Я закомментировал возвращаемую функцию и заменил последнюю строку на ту, которую вы упомянули, я не получаю none в качестве выходных данных. В конечном счете, если функция способна выводить все сегменты за один раз, без нескольких разных вызовов функций было бы действительно здорово.

4. возможно ли удалить следующее: address = «Flat 8, The Apartment, King Philip Street, SE1 3WX, Англия» и разрешить функции принимать любые аналогичные входные данные адреса и заставить функцию выводить нужные сегменты из адреса?

Ответ №2:

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

 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 ...]