Lubar, ho visto il tuo post su Stack Overflow ma pubblicherò una risposta simile qui per coerenza. È una buona domanda Lavoro nel settore della verifica degli indirizzi e ho già affrontato il tuo tipo di problema.
Ho collegato a questa domanda Stack Overflow in un commento; ed è importante sapere che non esiste alcuna garanzia circa il formato degli indirizzi completi a forma libera. Come menzionato nel post collegato, gli indirizzi completi possono apparire come uno di questi:
1) 102 main street Anytown, stato
2) 400n 600e # 2, 52173
3) punto 104 60203
4) 1234 LKSDFJlkjsdflkjsdljf #asdf 12345
5) 205 1105 14 90210
(I motivi sono spiegati nel post collegato.) Mi rendo conto che GeoPy restituisce gli indirizzi in un determinato formato - a seconda del geocoder utilizzato (il cui formato risultante è fuori dal controllo di GeoPy), ma gli indirizzi possono apparire in tutti i modi all'interno di un certo componente (come avere le virgole) ed è importante sapere che gli indirizzi standardizzati non dispongono di virgole (secondo la Pubblicazione 28 dell'USPS).
Di recente ho aiutato a lavorare su un'API chiamata LiveAddress ; è stato appena aggiornato per supportare il geocoding e l'analisi dell'indirizzo a riga singola.
GeoPy è progettato per geocodificare, non analizzare i componenti (tale compito è in realtà molto difficile per motivi che non entrerò qui). LiveAddress sarà , tuttavia, componentize l'indirizzo e restituire le coordinate e altre informazioni circa l'indirizzo, e solo se gli indirizzi sono reali; nessun risultato "indovinato".
Per analizzare un indirizzo a riga singola in componenti usando Python, inserisci semplicemente l'indirizzo nel campo "street":
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)
L'oggetto JSON risultante conterrà un components
oggetto simile a questo:
"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"
}
La risposta includerà anche la combinazione first_line e delivery_line_2, quindi non è necessario concatenarli manualmente se necessario.