2012-03-27 10 views
2

Ich bin neu in Python und ich habe eine chaotische Datenbank aufgeräumt mit einer Kombination von Google verfeinern http://code.google.com/p/google-refine/ und Excel, aber ich denke, dass Python einen besseren Job machen kann, solange ich in der Lage bin, einige "Rezepte" zu bekommen Ich kann es wiederverwenden.Split-String-Elemente einer Liste mit mehreren Trennzeichen/Bedingungen. Jede gute Python-Bibliothek?

Eine Variation meines Problems ist die Inkonsistenz im Feld 'Location' der Datenbank. Etwa 95% der Daten haben das Format in der Liste Location1, das ich mit Python effizienter verarbeiten konnte als mit der Verwendung von Excel-Filtern. Ich suche jedoch nach einer Python-Bibliothek oder einem Python-Rezept, das es mir erlauben würde, mit allen Arten von Geo-Orten in der Datenbank zu arbeiten, vielleicht durch Definieren von Mustern innerhalb der Liste.

Vielen Dank im Voraus für Ihre Hilfe!

Location1=['Washington, DC','Miami, FL','New York, NY'] 
Location2=['Kaslo/Nelson area (Canada), BC','Plymouth (UK/England)', 'Mexico, DF - outskirts-, (Mexico),'] 
Location3=['38.206471, -111.165271'] 

# This works for about 95% of the data, basically US addresses on Location1 type of List 
CityList=[loc.split(',',1)[0] for loc in Location1] 
StateList=[loc.split(',',1)[1] for loc in Location1] 
+1

Ein Weg, um dieses Problem könnte sein, jeden Eintrag über einen Geocoder auszuführen, dann einen umgekehrten Geocoder, der Ihnen ein strukturiertes Ergebnis geben würde. Ich würde GeoNames für beide vorschlagen: http://www.geonames.org – arboc7

+1

Verwenden Sie reguläre Ausdrücke, um jeden Eintrag an ein bestimmtes Format anzupassen, und schreiben Sie dann Code für jeden Fall. Dies setzt voraus, dass Sie mit der Mehrheit der abweichenden Daten mit einer überschaubaren Anzahl von separaten Ausdrücken umgehen können. –

+2

Mit Regexen können Sie Gruppen von Elementen erfassen. Zum Beispiel: der Ausdruck "" (\ w +) \ W *, \ W * (\ w {2}) "' passt Eingaben wie "Spokane, WA" '. Mit den Capture-Gruppen in der Regex ergibt das 're'-Match-Objekt eine' groups() 'wie folgt' ("Spokane", "WA") '. –

Antwort

1

Nicht sicher, ob Sie weiterhin Probleme mit diesem, aber hier ist eine Antwort, die ich glaube, für Sie arbeiten würde:

#location_regexes.py 
import re 
paren_pattern = re.compile(r"([^(]+,)?([^(]+?),? \(([^)]+)\)") 

def parse_city_state(locations_list): 
    city_list = [] 
    state_list = [] 
    coordinate_pairs = [] 
    for location in locations_list: 
     if '(' in location: 
      r = re.match(paren_pattern, location) 
      city_list.append(r.group(2)) 
      state_list.append(r.group(3)) 
     elif location[0].isdigit() or location[0] == '-': 
      coordinate_pairs.append(location.split(', ')) 
     else: 
      city_list.append(location.split(', ', 1)[0]) 
      state_list.append(location.split(', ', 1)[1]) 
    return city_list, state_list, coordinate_pairs 

#to demonstrate output 
if __name__ == "__main__": 
    locations = ['Washington, DC', 'Miami, FL', 'New York, NY', 
       'Kaslo/Nelson area (Canada), BC', 'Plymouth (UK/England)', 
       'Mexico, DF - outskirts-, (Mexico),', '38.206471, -111.165271'] 

    for parse_group in parse_city_state(locations): 
     print parse_group 

Ausgang:

$ python location_regexes.py 
['Washington', 'Miami', 'New York', 'Kaslo/Nelson area', 'Plymouth', 'DF - outskirts-'] 
['DC', 'FL', 'NY', 'Canada', 'UK/England', 'Mexico'] 
[['38.206471', '-111.165271']] 
+0

Ausgezeichnet! Vielen Dank! –

Verwandte Themen