从街道地址中去除街道号码

3
使用 Ruby(初学者)和正则表达式,我正在尝试从街道地址中提取街道号码。容易的地方我没有问题,但我需要一些帮助来解决:
'6223 1/2 S FIGUEROA ST' ==> 'S FIGUEROA ST'
感谢您的帮助!!
更新:
'6223 1/2 2ND ST' ==> '2ND ST'
来自@pesto的示例: '221B Baker Street' ==> 'Baker Street'

1
它需要在国际环境下工作吗?或者需要处理包含数字的美国街道名称吗? 有足够多的城市有“23rd street”。 - MSalters
7个回答

2

这将删除字符串前面的任何内容,直到遇到字母:

street_name = address.gsub(/^[^a-zA-Z]*/, '')

如果可能的话,要像“221B贝克街”这样的东西,你需要使用更复杂的内容。下面的代码应该可以实现:
street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')

@Kenny:我更新了一个正则表达式,可以解决“221B”类型的问题,同时仍然处理“1/2”。 - Pesto

2

分组匹配:

.*\d\s(.*)

如果您还需要考虑公寓号码:
.*\d.*?\s(.*)

这将处理123A街道名称。

只要字符串中没有其他数字,就应该去除前面的数字(和空格)。只需捕获第一组(.*)。


123 2nd ST 是一个问题。 - kenny

1

街道名称也可以是数字吗?例如:

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

1

1

哎呀!除非您正在使用标准化地址,否则单独解析地址可能会非常棘手。原因在于,“主要号码”(通常称为门牌号码)可以位于字符串的各个位置,例如:

  1. RR 2 Box 15(RR也可以是Rural Route、HC、HCR等)
  2. PO Box 17
  3. 12B-7A
  4. NW95E235
  5. 等等。

这不是一项微不足道的任务。根据您的应用程序需求,获得准确信息的最佳选择是利用地址验证网络服务。有一些提供此功能的供应商。

为了充分披露,我是SmartyStreets的创始人。我们有一个地址验证网络服务API,可以验证和标准化您的地址,以确保它是真实的,并允许您获取主要/门牌号码部分。如有问题,请随时与我联系。


0

/[^\d]+$/ 也可以匹配相同的内容,但不使用捕获组。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接