2010-07-29 3 views
2

что было бы лучшим способом разбить это на python. (Адрес, город, штат, почтовый индекс)Python string split

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

в некотором случае почтового индекса как

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

Это легко дать подход к этому конкретному примеру, но вы получите лучший ответ, если вы объясните, какие виды адресов вам нужно справиться и какие предположения вы делаете. Например: Может ли быть более одной адресной строки? Вам нужно обрабатывать международные адреса? Возможно ли, что state/zip будет на разных линиях? Будет ли
быть единственным способом разделения строк? И т.д. и т. Д. –

ответ

3

В зависимости от того, насколько сильно или рыхлых вы хотите быть по различным аспектам, которые не могут быть выведены из один пример, что-то вроде должно работать ...:

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

обязательный: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – teepark

+0

работает отлично, но если почтовый индекс только 5 цифр, он выдает ошибку – bobsr

+0

replace '(\ d {5} - \ d {4})' в конце regexp с помощью '(\ d {5} - \ d {4} | \ d {5}) ' – cji

0

Объединение BeautifulSoup и регулярные выражения должны дать вам что-то вроде:

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

это прекрасно работает, но если zip составляет всего 5 цифр (60634), он выдает ошибку – bobsr