Я работаю на SmartyStreets, где мы разрабатываем алгоритмы анализа и извлечения адресов.
Это сложно.
Если большинство ваших адресов находятся в США, вы можете использовать службу проверки адреса, чтобы обеспечить гарантированные точные результаты синтаксического анализа (поскольку адреса проверяются на главный список).
Есть несколько провайдеров, поэтому осмотритесь и найдите ту, которая вам подходит. Поскольку вы, вероятно, не сможете установить базу данных локально (не без большой платы, поскольку данные адреса лицензируются USPS), найдите тот, который предлагает конечную точку REST, чтобы вы могли просто сделать HTTP-запрос. Поскольку похоже, что у вас много адресов, убедитесь, что API является высокопроизводительным и позволяет выполнять пакетные запросы.
Например, с нашим:
Вход:
13001 Пойнт Richmond Dr NW, Gig Harbor WA
Выход:
![Address verified](https://i.stack.imgur.com/XcSF9.png)
Или более конкретно разбивки компонентов, если это необходимо:
![components](https://i.stack.imgur.com/BQdED.png)
Если вход даже грязнее, есть несколько услуг извлечения адреса доступны, которые могут обрабатывать немного шума в адрес и анализирует адреса из текста и превращает их в свои компоненты. (SmartyStreets предлагает это также как бета-API. Я считаю, что некоторые другие службы НЛП тоже делают подобные вещи.)
Конечно, это работает только для адресов в США. Я не специалист по британским или канадским адресам, но я считаю, что они могут быть немного проще в целом.
(Помимо небольшого количества хорошо развитых стран, международные данные действительно удачны и надежны. Надежные наборы данных трудно получить или их не существует. Но если вы на действительно жесткий бюджет вы можете написать свой собственный парсер для all the address formats.)
Являются ли форматы входной строки всегда одинаковыми? У вас есть пример ввода с адресом2. Кроме того, это только адреса США или другие страны? –
@AlvinBunk хороший вопрос. Я редактировал свой вопрос. –
Привет, Я задумал создать код Regex на основе примера @ChrisS, однако я согласен с Мэттом в том, что использование Regex's сложно с адресами. Возможно, вы захотите использовать что-то еще. –