使用 Ruby (newb) 和正则表达式,我试图从街道地址解析街道号码。我没有遇到简单的问题,但我需要一些帮助:
'6223 1/2 S FIGUEROA ST' ==> 'S FIGUEROA ST'
谢谢您的帮助!!
更新):
'6223 1/2 2ND ST' ==> '2ND ST'
来自@pesto '221B Baker Street' ==> 'Baker Street'
使用 Ruby (newb) 和正则表达式,我试图从街道地址解析街道号码。我没有遇到简单的问题,但我需要一些帮助:
'6223 1/2 S FIGUEROA ST' ==> 'S FIGUEROA ST'
谢谢您的帮助!!
更新):
'6223 1/2 2ND ST' ==> '2ND ST'
来自@pesto '221B Baker Street' ==> 'Baker Street'
组匹配:
.*\d\s(.*)
如果您还需要考虑公寓号码:
.*\d.*?\s(.*)
哪个会照顾 123A 街道名称
只要字符串中没有其他数字,那应该去掉前面的数字(和空格)。只需捕获第一组 (.*)
这将剥离字符串前面的任何内容,直到它碰到一个字母:
street_name = address.gsub(/^[^a-zA-Z]*/, '')
如果可能有像“221B Baker Street”这样的东西,那么你必须使用更复杂的东西。这应该有效:
street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')
还有另一组stackoverflow的答案: Parse usable Street Address, City, State, Zip from a string
我认为谷歌/雅虎解码器方法是最好的,但取决于你谈论的频率/多少地址 - 否则选择的答案可能是最好的
街道名称也可以是数字吗?例如
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
哎哟! 除非您使用标准化地址,否则单独解析地址可能会非常讨厌。原因是通常称为门牌号的“主号码”可以位于字符串中的各个位置,例如:
这不是一个微不足道的攻击。根据您的应用程序的需要,您最好使用地址验证网络服务来获得准确的信息。有少数提供此功能的提供商。
为了全面披露,我是 SmartyStreets 的创始人。我们有一个地址验证 Web 服务 API,它将验证和标准化您的地址,以确保它是真实的,并允许您获取主要/门牌号码部分。非常欢迎您亲自与我联系并提出问题。
/[^\d]+$/
也将匹配相同的东西,除了不使用捕获组。
为了将来参考,一个很好的帮助正则表达式的工具是http://www.rubular.com/