使用Ruby(newb)和正則表達式,我試圖從街道地址解析街道號碼。我並沒有與難辦的麻煩,但我需要一些幫助的:從街道地址剝離街道號碼
「6223 1/2秒FIGUEROA ST」 ==>的FIGUEROA ST'
感謝您的幫助!
UPDATE(S):
'6223 1/2 2ND ST' ==> '2ND ST'
和從@pesto '貝克街221B' ==> '貝克街'
使用Ruby(newb)和正則表達式,我試圖從街道地址解析街道號碼。我並沒有與難辦的麻煩,但我需要一些幫助的:從街道地址剝離街道號碼
「6223 1/2秒FIGUEROA ST」 ==>的FIGUEROA ST'
感謝您的幫助!
UPDATE(S):
'6223 1/2 2ND ST' ==> '2ND ST'
和從@pesto '貝克街221B' ==> '貝克街'
,直到達到一個字母這將在字符串的前飾條東西:
street_name = address.gsub(/^[^a-zA-Z]*/, '')
如果它可能有一些像「221B貝克街」,那麼你必須使用更復雜的東西。這應該工作:
street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')
不錯,但是謝謝 – kenny 2009-06-18 14:28:03
組匹配:
.*\d\s(.*)
如果您還需要考慮到公寓號碼:
.*\d.*?\s(.*)
這將需要123A街道名稱的保健
這應該在前面(和空間)剝去數字,所以只要有字符串中沒有其他數字。只需捕獲第一組(。*)
123 2nd ST是個問題。 – kenny 2009-06-18 14:40:52
/[^\d]+$/
也將匹配相同的東西,除非不使用捕獲組。
以供將來參考一個偉大的工具,以幫助正則表達式是http://www.rubular.com/
還有一個計算器組答案: 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
哎唷!解析一個地址本身可能是非常討厭的,除非你使用標準化的地址。這樣做的原因是,「主號碼」,這通常被稱爲房屋號碼可以在字符串內的各個位置,例如:
這不是一個簡單的undertacking。根據您的應用程序的需求,您最好打算準確信息是利用地址驗證Web服務。有少數提供此功能的提供商。
爲了充分披露,我是SmartyStreets的創始人。我們有一個address verification web service API將驗證和標準化您的地址,以確保它是真實的,並讓您獲得主/房號部分。歡迎您親自與我聯繫並提出問題。
是否需要在國際環境下工作?或者美國的街道名稱包含數字? 有足夠的城市與「第23街」。 – MSalters 2009-06-18 14:28:23