3

使用 Ruby (newb) 和正则表达式,我试图从街道地址解析街道号码。我没有遇到简单的问题,但我需要一些帮助:

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

谢谢您的帮助!!

更新):

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

来自@pesto '221B Baker Street' ==> 'Baker Street'

4

7 回答 7

2

组匹配:

.*\d\s(.*)

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

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

哪个会照顾 123A 街道名称

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

于 2009-06-18T14:20:23.990 回答
2

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

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

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

street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')
于 2009-06-18T14:25:40.233 回答
1

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

我认为谷歌/雅虎解码器方法是最好的,但取决于你谈论的频率/多少地址 - 否则选择的答案可能是最好的

于 2009-06-18T14:32:37.460 回答
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
于 2009-06-18T14:37:23.270 回答
1

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

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

这不是一个微不足道的攻击。根据您的应用程序的需要,您最好使用地址验证网络服务来获得准确的信息。有少数提供此功能的提供商。

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

于 2011-10-13T01:44:24.030 回答
0

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

于 2009-06-18T14:22:00.257 回答
0

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

于 2009-06-18T14:25:27.787 回答