Lubar, vi sua postagem no Stack Overflow, mas vou postar uma resposta semelhante aqui para garantir a consistência. É uma boa pergunta. Eu trabalho no setor de verificação de endereços e já lidei com seu tipo de problema antes.
Eu vinculei a esta questão do Stack Overflow em um comentário; e é importante saber que realmente não há garantia sobre o formato de endereços completos de forma livre. Conforme mencionado na postagem vinculada, os endereços completos podem se parecer com qualquer um destes:
1) 102 main street Anytown, estado
2) 400n 600e # 2, 52173
3) po # 104 60203
4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5) 205 1105 14 90210
(As razões são explicadas na postagem vinculada.) Percebo que o GeoPy retorna endereços em um determinado formato - dependendo do geocoder usado (cujo formato resultante está fora de controle do GeoPy), mas os endereços podem parecer de várias maneiras dentro de um certo componente (como vírgulas), e é importante saber que endereços padronizados não têm vírgulas (de acordo com a publicação 28 do USPS).
Ajudei a trabalhar em uma API recentemente chamada LiveAddress ; foi atualizado apenas para oferecer suporte à geocodificação e à análise de endereço de linha única.
O GeoPy foi projetado para geocodificar, não analisar componentes (essa tarefa é realmente muito difícil por razões que não abordarei aqui). LiveAddress vai , no entanto, inserir componentes o endereço e retornar coordenadas e outras informações sobre o endereço, e somente se os endereços são reais; nenhum resultado "adivinhado".
Para analisar um endereço de linha única em componentes usando Python, basta colocar o endereço inteiro no campo "rua":
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)
O objeto JSON resultante conterá um components
objeto que será algo parecido com isto:
"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"
}
A resposta também incluirá o first_line e delivery_line_2 combinados, para que você não precise concatená-los manualmente, se precisar deles.