удаление уличных номеров из уличных адресов
-
06-07-2019 - |
Вопрос
Используя Ruby (newb) и Regex, я пытаюсь разобрать номер улицы из уличного адреса.У меня не возникает проблем с простыми, но мне нужна некоторая помощь в:
'6223 1/2 S УЛИЦА ФИГЕРОА' ==> 'S УЛИЦА ФИГЕРОА'
Спасибо за помощь!!
ОБНОВЛЕНИЕ (ы):
'6223 1/2 2-й УЛИЦЫ' ==> '2-я УЛИЦА'
и от @pesto "Бейкер-стрит, 221Б" ==> "Бейкер-стрит"
Решение
Это удалит все, что находится в начале строки, пока не достигнет буквы:
street_name = address.gsub(/^[^a-zA-Z]*/, '')
Если возможно написать что-то вроде «Бейкер-стрит, 221Б», то придется использовать что-то более сложное.Это должно работать:
street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')
Другие советы
Соответствие группы:
.*\d\s(.*)
Если нужно еще учесть номера квартир:
.*\d.*?\s(.*)
Который позаботится о названии улицы 123А.
Это должно удалить числа впереди (и пробелы), если в строке нет других чисел.Просто захватите первую группу (.*)
Есть еще один набор ответов stackoverflow:Анализировать полезный адрес улицы, город, штат, почтовый индекс из строки
Я думаю, что подход декодера Google/Yahoo является лучшим, но это зависит от того, как часто/сколько адресов вы говорите - в противном случае выбранный ответ, вероятно, был бы лучшим
Могут ли названия улиц быть числами?Например.
1234 45TH ST
или даже
1234 45 ST
С первым случаем можно было разобраться выше, но со вторым сложнее.
Я бы разбил адрес на пробелы, пропустил бы все ведущие компоненты, не содержащие буквы, а затем соединил бы остаток.Я не знаю Ruby, но вот пример Perl, который также подчеркивает проблему моего подхода:
#!/usr/bin/perl
use strict;
use warnings;
my @addrs = (
'6223 1/2 S FIGUEROA ST',
'1234 45TH ST',
'1234 45 ST',
);
for my $addr ( @addrs ) {
my @parts = split / /, $addr;
while ( @parts ) {
my $part = shift @parts;
if ( $part =~ /[A-Z]/ ) {
print join(' ', $part, @parts), "\n";
last;
}
}
}
C:\Temp> skip
S FIGUEROA ST
45TH ST
ST
Ой!Синтаксический анализ адреса сам по себе может быть чрезвычайно неприятным, если только вы не работаете со стандартными адресами.Причина этого в том, что "основной номер", который часто называют номером дома, может находиться в разных местах строки, например:
- RR 2 Вставка 15 (RR также может быть Сельским маршрутом, HC, HCR и т.д.)
- Почтовый Ящик 17
- 12B-7A
- NW95E235
- и т.д.
Это не тривиальный перехват.В зависимости от потребностей вашего приложения, вам лучше всего получить точный информация заключается в использовании веб-сервиса проверки адреса.Есть несколько поставщиков услуг, которые предлагают такую возможность.
В интересах полного раскрытия информации, я являюсь основателем SmartyStreets.У нас есть API веб-службы проверки адресов это подтвердит и стандартизирует ваш адрес, чтобы убедиться, что он реальный, и позволит вам получить часть основного номера / номера дома.Вы можете обращаться ко мне лично с вопросами.
/[^\d]+$/
также будет соответствовать тому же самому, за исключением того, что без использования группы захвата.
Для дальнейшего использования отличный инструмент для помощи с регулярными выражениями: http://www.rubular.com/