Ruby (newb) と Regex を使用して、住所から番地を解析しようとしています。簡単なものには問題はありませんが、次の点について助けが必要です。
'6223 1/2 S フィゲロア ST' ==> 'S フィゲロア ST'
助けてくれてありがとう!!
更新:
'6223 1/2 2ND ST' ==> '2ND ST'
@pesto から '221B Baker Street' ==> 'Baker Street'
Ruby (newb) と Regex を使用して、住所から番地を解析しようとしています。簡単なものには問題はありませんが、次の点について助けが必要です。
'6223 1/2 S フィゲロア ST' ==> 'S フィゲロア ST'
助けてくれてありがとう!!
更新:
'6223 1/2 2ND ST' ==> '2ND ST'
@pesto から '221B Baker Street' ==> 'Baker Street'
これにより、文字列に当たるまで文字列の前にあるものがすべて削除されます。
street_name = address.gsub(/^[^a-zA-Z]*/, '')
「221Bベーカー街」のようなものが可能であれば、もっと複雑なものを使用する必要があります。これは機能するはずです:
street_name = address.gsub(/^((\d[a-zA-Z])|[^a-zA-Z])*/, '')
通りの名前も数字にすることができますか?例えば
1234 45TH ST
あるいは
1234 45 ST
上記の最初のケースに対処できますが、2番目のケースは困難です。
住所をスペースで分割し、文字を含まない主要なコンポーネントをスキップして、残りを結合します。私は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
別のstackoverflowの回答セットがあります: 文字列から使用可能な番地、市区町村、都道府県、郵便番号を解析します
私はグーグル/ヤフーデコーダーのアプローチが最善だと思いますが、あなたが話しているアドレスの頻度/数に依存します-そうでなければ、選択された答えがおそらく最高でしょう
痛い!標準化された住所で作業していない限り、住所を単独で解析するのは非常に厄介です。この理由は、家番号と呼ばれることが多い「プライマリ ナンバー」が文字列内のさまざまな場所にある可能性があるためです。たとえば、次のようになります。
それは些細な取り組みではありません。アプリケーションのニーズにもよりますが、正確な情報を取得するには、住所確認 Web サービスを利用するのが最善の方法です。この機能を提供するプロバイダーは少数です。
完全な開示のために、私は SmartyStreets の創設者です。住所を検証および標準化して、住所が本物であることを確認し、プライマリ/家番号部分を取得できるようにする、住所検証 Web サービス APIがあります。質問がある場合は、個人的に私に連絡してください。
/[^\d]+$/
キャプチャグループを使用しないことを除いて、同じものと一致します。
今後の参考のために、正規表現を支援する優れたツールはhttp://www.rubular.com/です。