使用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'==> '贝克街'
答案 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)
哎哟!除非您使用标准化地址,否则解析地址本身可能非常讨厌。这样做的原因是,通常称为门牌号的“主号码”可以位于字符串中的不同位置,例如:
这不是一个微不足道的事情。根据您的应用程序的需要,您最好选择准确的信息来利用地址验证Web服务。有少数提供商提供此功能。
为了充分披露,我是SmartyStreets的创始人。我们有一个address verification web service API来验证和标准化您的地址,以确保它是真实的,并允许您获得主要/门牌号码部分。非常欢迎您亲自与我联系。
答案 5 :(得分:0)
/[^\d]+$/
也会匹配相同的内容。
答案 6 :(得分:0)
为了将来参考,有助于正则表达式的一个很好的工具是http://www.rubular.com/