Adressen zerlegen mit Python
Ich bin kürzlich auf die Herausforderung gestoßen, verschiedene Adresstypen aufzusplitten. Gegeben war immer die Straße und die Hausnummer, allerdings in verschiedenen länderspezifischen Variationen.
Hier eine Datei Datensatz.txt
mit den Straßen:
Thanelstr. 46 Sieglinde-Briemer-Straße 716 Rennerstr. 542a 34, Rue de la Chanson 456 Market Square Auf der Burg Auf der Burg 234 90211 Melrost Place, Apt. 1
Hinweis: Benötigt man größere Mengen an Fake-Adressen, dann leistet die Faker-Bibliothek (https://github.com/joke2k/faker) gute Dienste. Mit dem folgenden Python-Code gelingt der Split in Straße und Hausnummer recht gut:
with open('Datensatz.txt', 'rt', encoding='utf-8') as eingabedatei: for zeile in eingabedatei: if zeile[-1] == '\n': zeile = zeile[:-1] # Entferne Zeilenumbruch, falls vorhanden gesplittet = zeile.split(' ') # Splitte anhand des Leerzeichens print(gesplittet) # gibt die Liste aus if gesplittet[-1].isdigit() and gesplittet[0].isdigit(): namensteil = '' for i in gesplittet[1:]: namensteil = namensteil + " " + i print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0], sep = '') elif gesplittet[-1][0].isdigit() and gesplittet[-1][-1].isalpha(): namensteil = '' for i in gesplittet[:-1]: namensteil = namensteil + " " + i print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[-1], sep = '') elif gesplittet[-1].isdigit(): namensteil = '' for i in gesplittet[:-1]: namensteil = namensteil + " " + i print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[-1], sep = '') elif gesplittet[0].isdigit(): namensteil = '' for i in gesplittet[1:]: namensteil = namensteil + " " + i print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0], sep = '') elif gesplittet[0][0].isdigit() and gesplittet[0][-1] == ',': namensteil = '' for i in gesplittet[1:]: namensteil = namensteil + " " + i print('Name ist "', namensteil.strip() , '", Hausnummer ist ', gesplittet[0][:-1], sep = '') |
Ergebnis:
['Thanelstr.', '46'] Name ist "Thanelstr.", Hausnummer ist 46 ['Sieglinde-Briemer-Straße', '716'] Name ist "Sieglinde-Briemer-Straße", Hausnummer ist 716 ['Rennerstr.', '542a'] Name ist "Rennerstr.", Hausnummer ist 542a ['34,', 'Rue', 'de', 'la', 'Chanson'] Name ist "Rue de la Chanson", Hausnummer ist 34 ['456', 'Market', 'Square'] Name ist "Market Square", Hausnummer ist 456 ['Auf', 'der', 'Burg'] ['Auf', 'der', 'Burg', '234'] Name ist "Auf der Burg", Hausnummer ist 234 ['90211', 'Melrost', 'Place,', 'Apt.', '1'] Name ist "Melrost Place, Apt. 1", Hausnummer ist 90211
Die Lösung ist nicht optimal, besser fährt man sicher mit libpostal und seinen Python-Bindings (https://github.com/openvenues/pypostal)