R(正则表达式)-从地址末尾删除公寓,单元和其他字词

时间:2018-12-01 20:31:02

标签: r regex geolocation pcre street-address

我有一个很大的地址数据集,我打算在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. 地址以许多不同的指示符结尾,例如STREETAVENUE
  3. 有些交叉点(用&表示)可能包括两次类似STAVENUE的指示符。

我正在使用R,尝试应用sub()函数来解决问题,但没有成功。以下是我的最新尝试。

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

我知道很多问题会问类似的问题,但是没有一个直接解决这个问题,我怀疑这与其他用户有关。

1 个答案:

答案 0 :(得分:0)

尽管我觉得删除最后一个字应该对您有用,但是为了更加安全,您可以使用此正则表达式保留您想要的内容,并以更安全的方式丢弃您不需要的内容。

(.*(?: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)

See this demo