代码之家  ›  专栏  ›  技术社区  ›  kenny Shiraz Bhaiji

从街道地址中删除街道编号

  •  3
  • kenny Shiraz Bhaiji  · 技术社区  · 15 年前

    使用Ruby(Newb)和Regex,我试图从街道地址解析街道号。我对简单的没有什么问题,但我需要一些帮助:

    '6223 1/2 s Figueroa St'==>'s Figueroa St'

    谢谢你的帮助!!

    更新(S):

    '6223 1/2 2nd st'==>'2nd st'

    从@豌豆 '221B贝克街'==>'Baker街'

    7 回复  |  直到 13 年前
        1
  •  2
  •   Pesto    15 年前

    这将剥去字符串前面的任何内容,直到它碰到一个字母:

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

    如果有可能有“221B贝克街”之类的东西,那么你必须使用更复杂的东西。这应该有效:

    street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')
    
        2
  •  2
  •   Bryan Denny    15 年前

    组匹配:

    .*\d\s(.*)
    

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

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

    它可以处理123A街道名

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

        3
  •  1
  •   Community Egal    7 年前

    还有另一组叠加溢出的答案: Parse usable Street Address, City, State, Zip from a string

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

        4
  •  1
  •   Sinan Ünür    15 年前

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

    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
    
        5
  •  1
  •   Jonathan Oliver    13 年前

    哎哟!如果不使用标准化的地址,那么自行解析地址会非常麻烦。这样做的原因是,通常称为门牌号的“主号码”可以位于字符串中的不同位置,例如:

    1. RR 2框15(RR也可以是乡村路线、HC、HCR等)
    2. 邮政信箱17
    3. 12B-7A
    4. NW95E255
    5. 等。

    这不是一个微不足道的小题大做。根据应用程序的需要,您最好 精确的 信息是使用地址验证Web服务。有少数供应商提供这种功能。

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

        6
  •  0
  •   Ben Hughes    15 年前

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

        7
  •  0
  •   Andrew    15 年前

    为了将来参考,帮助regex的一个很好的工具是 http://www.rubular.com/