R (regex) - удаление квартиры, единицы и других слов из конца адреса - PullRequest
0 голосов
/ 01 декабря 2018

У меня большой набор данных адресов, которые я планирую геокодировать в ArcGIS (геолокация Google слишком дорога).Примеры адресов приведены ниже.

9999 ST PAUL ST BSMT

GARRISON BL & BOARMAN AVENUE REAR

1234 MAIN STREET 123

1234 MAIN ST UNIT1

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

9999 ST PAUL ST

GARRISON BL & BOARMAN AVENUE

1234 MAIN STREET

1234 MAIN ST

Основные проблемы включают

  1. ST используется как для сокращения улиц, так и для обозначения «SAINT» в названиях улиц.
  2. Адреса заканчиваются на многих различных индикаторах, таких как STREET и AVENUE
  3. . Существуют пересечения (обозначенные &), которые могут включать такие индикаторы, как ST и AVENUE дважды.

Используя R, я пытаюсь применить функцию sub() для решения проблемы, но я не добился успеха.Ниже моя последняя попытка.

sub("(.*)ST","\\1",df$Address,perl=T)

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

1 Ответ

0 голосов
/ 01 декабря 2018

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

(.*(?:ST|AVENUE|STREET)\b).*

Здесь .*(?:ST|AVENUE|STREET)\b захватывает ваши намеченные данные, захватывая все с начала жадным образом и останавливаясь, только когда встречает любое из этих слов ST или AVENUE или STREET (то есть последнее вхождение этих слов), и все, что следует после этого,будет отброшено то, что вы хотели.В вашем текущем случае у вас есть только одно слово, но оно может отбросить более одного слова или даже что-нибудь, что встречается после этих конкретных слов.Предполагаемые данные собираются в группе 1, поэтому просто замените их на \1

Так что вместо этого

sub("(.*)ST","\\1",df$Address,perl=T)

попробуйте это,

sub("(.*(?:ST|AVENUE|STREET)\b).*","\\1",df$Address,perl=T)

Посмотреть это демо

...