1

ループを作成し、正規表現を使用して 4 つの変数のいずれかに入力する必要があります

$address, $street, $town, $lot

ループには、以下の行のように情報が含まれている可能性のある文字列が供給されます

  • '123 any street, mytown'また
  • 'Lot 4 another road, thattown'また
  • 'Lot 2 96 other road, her town'また
  • 'this ave, this town'また
  • 'yourtown'

カンマ以降$town

(.*), (.*)

次に、最初のキャプチャが数字で始まる場合、最初のキャプチャをチェックできます(Lot \d*) (.*), (.*) 。次に、そのアドレス (空白の$streetある単語の場合)$town

4

5 に答える 5

7

これらが米国の住所である場合は、Geo :: StreetAddress::USを確認してください。

そうでない場合でも、このモジュールのソースから、自由形式の番地の解析に何が関係しているかがわかります。

投稿したアドレスを処理するスクリプトは次のとおりです(更新された以前のバージョンでは、ロットと番号を1つの文字列に結合しました)。

#!/usr/bin/perl

use strict; use warnings;

local $/ = "";

my @addresses;

while ( my $address = <DATA> ) {
    chomp $address;
    $address =~ s/\s+/ /g;
    my (%address, $rest);
    ($address{town}, $rest) = map { scalar reverse }
                        split( / ?, ?/, reverse($address), 2 );

    {
        no warnings 'uninitialized';
        @address{qw(lot number street)} =
            $rest =~ /^(?:(Lot [0-9]) )?(?:([0-9]+) )?(.+)\z/;
    }
    push @addresses, \%address;
}

use Data::Dumper;
print Dumper \@addresses;

__DATA__
123 any street,
mytown

Lot 4 another road,
thattown

Lot 2 96 other road,
her town

yourtown

street,
town

出力:

$ VAR1 = [
          {{
            'lot' => undef、
            '番号'=>'123'、
            '通り'=>'任意の通り'、
            'タウン'=>'マイタウン'
          }、
          {{
            'ロット'=>'ロット4'、
            'number' => undef、
            '通り'=>'別の道路'、
            '町'=>'あの町'
          }、
          {{
            'ロット'=>'ロット2'、
            '番号'=>'96'、
            '通り'=>'他の道路'、
            '町'=>'彼女の町'
          }、
          {{
            'lot' => undef、
            'number' => undef、
            'street' => undef、
            '町'=>'あなたの町'
          }、
          {{
            'lot' => undef、
            'number' => undef、
            '通り'=>'通り'、
            '町'=>'町'
          }
        ];
于 2010-02-18T13:48:12.260 に答える
7

このすべてを単一の正規表現で実行しようとしないことをお勧めします。これは、その正確性を検証するのが難しいためです。

まず、コンマで分割します。コンマの後に続くものはすべて $town であり、コンマがない場合は文字列全体が $town です。

次に、ロット情報があるかどうかを確認し、文字列から抽出します。

次に、通り/大通りの番号と名前を探します。

分割統治 :)

于 2010-02-18T12:26:42.270 に答える
1

これは 3 つの部分に分かれている必要があります。住所/番地はどのように区別しますか?

(Lot \d*)? ?([^,]*,)? ?(.*)

これがあなたの例の内訳です

('', '123 any street,', 'mytown')
('Lot 4', 'another road,', 'thattown')
('Lot 2', '96 other road,', 'her town')
('', 'this ave,', 'this town')
('', '', 'yourtown')

私が正しく理解していれば、これは住所/通りも分離します

(Lot \d*)? ?(\d*) ?([^,]*,)? ?(.*)

('', '123', 'any street,', 'mytown')
('Lot 4', '', 'another road,', 'thattown')
('Lot 2', '96', 'other road,', 'her town')
('', '', 'this ave,', 'this town')
('', '', '', 'yourtown')
于 2010-02-18T12:36:10.003 に答える
0

Geo::StreetAddress::US は単純な住所には問題ありませんが、難しい例ではコンテキストが失われる可能性があります。郊外が見つかるまで通りの名前を解析します。「46 7th St. Johns Park」では、「St.」が消費されるのが早すぎると、通りのタイプが誤って「公園」に割り当てられ、「CA」の駅が郊外になります。

2 Smith St Suburb NJ 12345              2 Smith           St   Suburb          NJ 12345
25 MIRROR LAKE DR LITTLE EGG HARBOR    25 MIRROR LAKE DR  Hbr  NJ                     0
74B Old Bohema Rd N, St. Johns Park    74 B Old Bohema    Rd   St Johns Park   CA 95472
74 Mt Baw Baw Rd Suite C Some Park C   74 Mt Baw Baw Rd S Park CA                     0
74 Old Bohema Rd Bldg A Some Park CA   74 Old Bohema Rd B Park CA                     0
74 Old Bohema Rd Rm 123A Some Park C   74 Old Bohema Rd R Park CA                     0
Lot 74 Old Bohema Rd Some Park CA 95    0 Old Bohema Rd S Park CA                     0
22 Glen Alpine Way Some Park CA 9547   22 Glen Alpine Way Park CA                     0
4/6 Bohema Rd, St. Johns Park CA 954    4 6 Bohema        Rd   St Johns Park   CA 95472
46 The Parade, St. Johns Park CA 954   46 The                  Parade                 0
46 7th St. Johns Park CA 95472         46 7th St Johns    Park CA                     0
46 B Avenue Johns Park CA 95472        46 B Avenue Johns  Park CA                     0
46 Avenue C Johns Park CA 95472        46 Avenue C Johns  Park CA                     0
46 Broadway Johns Park CA 95472        46 Broadway Johns  Park CA                     0
46 State Route 19 Johns Park CA 9547   46 State Route 19  Park CA                     0
46 John F Kennedy Drive Johns Park C   46 John F Kennedy  Park CA                     0
PO Box 213 Somewhere IO 1234            0 Somewhere            IO                     0
1 BEACH DR SE # 2410 ST PETERSBURG F    1 BEACH DR SE # 2 St   PETERSBURG      FL 33701
# 123 12 BEACH DR SE ST PETERSBURG F   12 BEACH DR SE     St   PETERSBURG      FL 33701
46 Broad Street #12 Suburb CA 95472    46 Broad           St                          0

これらのより難しいパターンの多くを識別できる Perl モジュールを開発しましたhttps://metacpan.org/release/Lingua-EN-AddressParse。「The Parade」、nth Street などのイディオム、「46 Broad Street #12」などのサブ プロパティ アドレスなどを認識します。

于 2015-03-04T01:52:07.983 に答える
0

最後の 1 つと一致することはできませんが、最初の 3 つについては、次のようなものを使用できます。

if (preg_match('/(?:Lot (\d*)|)(?: |)(?:(\d*)|) (.*), (.*)/m', $subject, $regs)) {
    $result = $regs[1];
} else {
    $result = "";
}

これはテスト用の正規表現です:

(?:Lot (\d*)|)(?: |)(?:(\d*)|) (.*), (.*)

これを regexbuddy で使用してテストできます:リンク

于 2010-02-18T12:41:26.817 に答える