从街道地址剥离街道号码

时间:2009-06-18 14:16:08

标签: ruby regex street-address

使用Ruby(newb)和Regex,我正在尝试从街道地址解析街道号码。我没有遇到容易的问题,但我需要一些帮助:

'6223 1/2 S FIGUEROA ST'==> 'S FIGUEROA ST'

感谢您的帮助!!

UPDATE(S):

'6223 1/2 2ND ST'==> '2ND ST'

来自@pesto '221B Baker Street'==> '贝克街'

7 个答案:

答案 0 :(得分:2)

小组匹配:

.*\d\s(.*)

如果您还需要考虑公寓号码:

.*\d.*?\s(.*)

哪个会照顾123A街道名称

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

答案 1 :(得分:2)

这将删除字符串前面的任何内容,直到它出现一个字母:

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

如果有可能拥有像“221B Baker Street”这样的东西,那么你必须使用更复杂的东西。这应该有效:

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

答案 2 :(得分:1)

还有另一个stackoverflow答案集: Parse usable Street Address, City, State, Zip from a string

我认为google / yahoo解码器方法最好,但取决于你所谈论的频率/多个地址 - 否则所选答案可能是最好的

答案 3 :(得分:1)

街道名称也可以是数字吗? E.g。

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

答案 4 :(得分:1)

哎哟!除非您使用标准化地址,否则解析地址本身可能非常讨厌。这样做的原因是,通常称为门牌号的“主号码”可以位于字符串中的不同位置,例如:

  1. RR 2方框15(RR也可以是乡村路线,HC,HCR等)
  2. 邮政信箱17
  3. 12B-7A
  4. NW95E235
  5. 这不是一个微不足道的事情。根据您的应用程序的需要,您最好选择准确的信息来利用地址验证Web服务。有少数提供商提供此功能。

    为了充分披露,我是SmartyStreets的创始人。我们有一个address verification web service API来验证和标准化您的地址,以确保它是真实的,并允许您获得主要/门牌号码部分。非常欢迎您亲自与我联系。

答案 5 :(得分:0)

除了不使用捕获组之外,

/[^\d]+$/也会匹配相同的内容。

答案 6 :(得分:0)

为了将来参考,有助于正则表达式的一个很好的工具是http://www.rubular.com/