Регулярное выражение для разделения адреса улицы, который может иметь необязательные числа с косой чертой или дефисом в конце - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь прочитать адрес улицы и разделить улицу и номер с помощью регулярного выражения.

Адрес может выглядеть так:

Ebory Mebory Street 1
Eborymebory Street 23/2
Filler Filler Filler Street 1-32

Я попытался разделить строку, используя split(), а затем снова собрал название улицы (если в разделенной строке не обнаружено цифр).

Это работает только для первого случая. Я думаю, что было бы лучше, если бы я использовал регулярные выражения. Проблема в том, что мое понимание регулярных выражений довольно ограничено.

adress = "Ebory mebory Street 23".split()
street = ""
number = ""
for item in adress:
  if(not(item.isdigit())):
     street = street + item + " "
  else:
     number = item

Результат, который я получаю, верен, но только для этого случая. Если адрес Eborymebory Street 23/24, он не будет работать из-за косой черты.

Итак, вопрос в том, как получить адрес улицы вместе с числами в конце строки, учитывая, что эти числа могут быть необязательными?

1 Ответ

0 голосов
/ 21 апреля 2019

Вы можете использовать регулярное выражение, как

(.*?)\s*(\d+(?:[/-]\d+)?)?$

См. Демонстрационную версию regex и демонстрационную версию Regulex :

enter image description here

Детали

  • (.*?) - Группа захвата 1: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • \s* - 0+ пробелов
  • (\d+(?:[/-]\d+)?)? - необязательная группа захвата 2: 1+ цифр, а затем необязательная последовательность / или - ([/-]) с последующими 1+ цифрами
  • $ - конец строки.

См. Демонстрационную версию Python с re.match (это позволяет сопоставить шаблон только в начале строки):

import re
addresses = ["Ebory Mebory Street 1",
    "Eborymebory Street 23/2",
    "Filler Filler Filler Street 1-32",
    "Filler Filler Filler Street"]
for address in addresses:
    street = ""
    number = ""
    m = re.match(r"(.*?)\s*(\d+(?:[/-]\d+)?)?$", address)
    if m:
        street, number = m.groups()
        if not number:
            number = ""
        print("Address: {}\nStreet: {}\nNumber: {}".format(address, street, number))

Выход:

Address: Ebory Mebory Street 1
Street: Ebory Mebory Street
Number: 1
Address: Eborymebory Street 23/2
Street: Eborymebory Street
Number: 23/2
Address: Filler Filler Filler Street 1-32
Street: Filler Filler Filler Street
Number: 1-32
Address: Filler Filler Filler Street
Street: Filler Filler Filler Street
Number: 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...