22

21-big walk way や 21 St.Elizabeth's drive など、住所を容易にする正規表現を書き込もうとしています。次の正規表現を思いつきましたが、すべての文字 (英数字、スペースダッシュ、ピリオド、アポストロフィ)

"regexp=^[A-Za-z-0-99999999'
4

13 に答える 13

28

正規表現によるアドレス検証に関するこの質問への回答を参照してください: regex street address match

問題は、番地のフォーマットが非常に多様であるため、それらに対してコーディングするのが難しいことです。アドレスを検証しようとしている場合、その形式に基づいてアドレスが有効でないかどうかを見つけるのは非常に困難です。これは、次の住所 (253 N. Cherry St.) を同じ形式で返します。

\d{1,5}\s\w.\s(\b\w*\b\s){1,2}\w*\.

これにより、家屋番号に 1 ~ 5 桁の数字、スペース、ピリオドが続く文字 (N または S の場合)、通りの名前に 1 ~ 2 語、省略形 (st. や rd. など) で終わることができます。 .

正規表現は標準またはプロトコル (定義したもの) を満たしているかどうかを確認するために使用されるため、上記のアドレス、特に最初のダッシュが付いたアドレスはあまり標準的ではないため、許可したくないでしょう。上記のコードを変更して、必要に応じてそれらを許可することができます-追加できます

(-?)

ダッシュを許可しますが、必要としません。

さらに、http://rubular.com/は、正規表現を学ぶための迅速かつインタラクティブな方法です。上記のアドレスで試してみてください。

于 2012-07-12T17:49:03.847 に答える
19

上記のようにアドレスの固定形式がない場合は、正規表現を使用して、アドレスで使用されていない記号 (特殊な記号 - &(%#$^) など) を削除します。結果はなれ:

[A-Za-z0-9'\.\-\s\,]
于 2013-09-17T15:26:57.580 に答える
2

正規表現は、この種のタスクには非常に悪い選択です。代わりに、住所データを消去できる Web サービス、住所データベース、または製品を探してみてください。

関連している:

于 2014-04-03T09:20:49.133 に答える
0

正規表現を使用してアドレスを見つけるために取ったアプローチは次のとおりです。

一連のパターンは、単純な数字で始まり、一連の文字列が続く住所から予想される多くの形式を見つけるのに役立ちます (例: 1 Basic Road)。その後、"PO Box"、"c /o"、"attn:" など。

以下は、python での簡単なテストです。テストではすべての住所が検出されますが、会社名である最後の 4 つの項目は検出されません。この例は包括的ではありませんが、ニーズに合わせて変更し、データで見つけた例をキャッチすることができます。

import re
strings = [
    '701 FIFTH AVE',
    '2157 Henderson Highway',
    'Attn: Patent Docketing',
    'HOLLYWOOD, FL 33022-2480',
    '1940 DUKE STREET',
    '111 MONUMENT CIRCLE, SUITE 3700',
    'c/o Armstrong Teasdale LLP',
    '1 Almaden Boulevard',
    '999 Peachtree Street NE',
    'P.O. BOX 2903',
    '2040 MAIN STREET',
    '300 North Meridian Street',
    '465 Columbus Avenue',
    '1441 SEAMIST DR.',
    '2000 PENNSYLVANIA AVENUE, N.W.',
    '465 Columbus Avenue',
    '28 STATE STREET',
    'P.O, Drawer 800889.',
    '2200 CLARENDON BLVD.',
    '840 NORTH PLANKINTON AVENUE',
    '1025 Connecticut Avenue, NW',
    '340 Commercial Street',
    '799 Ninth Street, NW',
    '11318 Lazarro Ln',
    'P.O, Box 65745',
    'c/o Ballard Spahr LLP',
    '8210 SOUTHPARK TERRACE',
    '1130 Connecticut Ave., NW, Suite 420',
    '465 Columbus Avenue',
    "BANNER & WITCOFF , LTD",
    "CHIP LAW GROUP",
    "HAMMER & ASSOCIATES, P.C.",
    "MH2 TECHNOLOGY LAW GROUP, LLP",
]

patterns = [
    "c\/o [\w ]{2,}",
    "C\/O [\w ]{2,}",
    "P.O\. [\w ]{2,}",
    "P.O\, [\w ]{2,}",
    "[\w\.]{2,5} BOX [\d]{2,8}",
    "^[#\d]{1,7} [\w ]{2,}",
    "[A-Z]{2,2} [\d]{5,5}",
    "Attn: [\w]{2,}",
    "ATTN: [\w]{2,}",
    "Attention: [\w]{2,}",
    "ATTENTION: [\w]{2,}"
]
contact_list = []
total_count = len(strings)
found_count = 0
for string in strings:
    pat_no = 1
    for pattern in patterns:
        match = re.search(pattern, string.strip())
        if match:
            print("Item found: " + match.group(0) + " | Pattern no: " + str(pat_no))
            found_count += 1
        pat_no += 1

print("-- Total: " + str(total_count) + " Found: " + str(found_count)) 
于 2020-07-11T18:55:30.853 に答える