ルバー、私はあなたの投稿をスタックオーバーフローで見ましたが、一貫性を保つために同様の答えをここに投稿します。いい質問ですね。私は住所確認業界で働いており、以前はこの種の問題に取り組んできました。
このスタックオーバーフローの質問にコメントでリンクしました。完全なフリーフォームの番地の形式については保証がないことを知っておくことが重要です。リンクされた投稿で述べられているように、完全なアドレスは次のいずれかのようになります。
1)102メインストリートエニータウン、州
2)400n 600e#2、52173
3)po#104 60203
4)1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5)205 1105 14 90210
(理由はリンクされた投稿で説明されています。)私は、GeoPyが特定の形式で住所を返すことを理解しています-使用されるジオコーダーによって(結果の形式はGeoPyの制御範囲外です)、住所は特定の範囲内であらゆる種類の方法を見ることができます(カンマのような)コンポーネント、および標準化されたアドレスにはカンマがないことを知ることが重要です(USPS Publication 28によると)。
最近、LiveAddressと呼ばれるAPIの作業を手伝いました。ジオコーディングと単一行の住所解析をサポートするようにアップグレードされました。
GeoPyは、コンポーネントに解析するのではなく、ジオコーディングするように設計されています(このタスクは、ここでは説明しないため、実際には非常に困難です)。ただし、LiveAddress は、住所をコンポーネント化し、住所に関する座標やその他の情報を返します。「推測された」結果はありません。
Pythonを使用して単一行の住所をコンポーネントに解析するには、住所全体を「番地」フィールドに入力するだけです。
import json
import pprint
import urllib
LOCATION = 'https://api.smartystreets.com/street-address/'
QUERY_STRING = urllib.urlencode({ # entire query sting must be URL-Encoded
'auth-token': r'YOUR_API_KEY_HERE',
'street': '1 infinite loop cupertino ca 95014'
})
URL = LOCATION + '?' + QUERY_STRING
response = urllib.urlopen(URL).read()
structure = json.loads(response)
pprint.pprint(structure)
結果のJSONオブジェクトには、components
次のようなオブジェクトが含まれます。
"components": {
"primary_number": "1",
"street_name": "Infinite",
"street_suffix": "Loop",
"city_name": "Cupertino",
"state_abbreviation": "CA",
"zipcode": "95014",
"plus4_code": "2083",
"delivery_point": "01",
"delivery_point_check_digit": "7"
}
応答にはfirst_lineとdelivery_line_2の組み合わせも含まれるため、必要な場合に手動で連結する必要はありません。