2010-07-29 4 views
2

quelle serait la meilleure façon de diviser cela en python. (Adresse, ville, état, code postal)Python chaîne divisée

<div class="adtxt">7616 W Belmont Ave<br />Chicago, IL 60634-3225</div> 

dans un code postal de cas est la

<div class="adtxt">7616 W Belmont Ave<br />Chicago, IL 60634</div> 
+1

Il est facile de donner une approche pour cet exemple précis, mais vous obtiendrez une meilleure réponse si vous expliquez quels types d'adresses vous devez gérer, et quelles hypothèses vous faites. Par exemple: Peut-il y avoir plus d'une ligne d'adresse? Avez-vous à gérer des adresses internationales? Est-il possible que l'état/zip soit sur des lignes différentes? Le
sera-t-il le seul moyen de séparer les lignes? Etc .. –

Répondre

3

Selon la façon dont serré ou laxiste que vous voulez être sur les différents aspects qui ne peuvent être déduits de un seul exemple, quelque chose comme ce qui suit devrait fonctionner ...:

import re 

s = re.compile(r'^<div.*?>([^<]+)<br.*?>([^,]+), (\w\w) (\d{5}-\d{4})</div>$') 
mo = s.match(thestring) 
if mo is None: 
    raise ValueError('No match for %r' % thestring) 
address, city, state, zip = mo.groups() 
+1

obligatoire: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – teepark

+0

le travail bien, mais si le zip est seulement 5 chiffres, il renvoie erreur – bobsr

+0

remplacer '(\ d {5} - \ d {4})' à la fin de l'expression rationnelle avec '(\ d {5} - \ d {4} | \ d {5}) ' – cji

0

La combinaison beautifulsoup et les expressions régulières devrait vous donner quelque chose comme:

import BeautifulSoup 
import re 
thestring = r'<div class="adtxt">7616 W Belmont Ave<br />Chicago, IL 60634-3225</div>' 
re0 = re.compile(r'(?P<address>[^<]+)') 
re1 = re.compile(r'(?P<city>[^,]+), (?P<state>\w\w) (?P<zip>\d{5}-\d{4})') 
soup = BeautifulSoup.BeautifulSoup(thestring) 
(address,) = re0.search(soup.div.contents[0]).groups() 
city, state, zip = re1.search(soup.div.contents[2]).groups() 
+0

cela fonctionne bien, mais si le zip est seulement 5 chiffres (60634), il jette une erreur – bobsr